ScriptCS i szybki prototyp z WebAPI

W poniedziałek pisałem, że nie testowałem scriptcs-sublime. To się już zmieniło. Zainstalowałem i działa. Co więcej zainstalowałem drugi plugin build-with-input a to wszystko po to aby móc do skryptu przesłać coś za pomocą klawiatury bezpośrednio z poziomu samego sublime text-a.

Instalacja:

w konsoli gita teleportuję się do C:\Users\[uzytkownik]\AppData\Roaming\Sublime Text 2\Packages i wpisujemy magiczne znaki runiczne:

git clone https://github.com/scriptcs/scriptcs-sublime.git

oraz

git clone https://github.com/eric-wieser/build-with-input.git

to pobierze nam najnowsze wersje dodatków scriptcs-sublime oraz build-with-input. Narzędzie naostrzone zatem przestrzelamy sublime text-a i piszemy:

    Console.Write("what is your name : ");
    string name = Console.ReadLine();
    Console.WriteLine("Hello {0}",name);

w konsoli możemy teraz zapodać Enter –> wpisać tekst –> jeszcze jeden Enter i mamy działający program na poziomie początkującym początkującym.

image

Proste, zatem przejdźmy do czegoś trochę bardziej skomplikowanego. Serwer z webapi w 34 linijkach.

Uruchomimy serwer na porcie 85 (powinien być wolny). Jeśli tak samo jak ja wyznajesz, że developer nie powinien mieć uprawnień administratora lokalnego to przydzielmy sobie przestrzeń nazw za nim będzie za późno 😉 W konsoli (z uprawnieniami admina)

netsh http add urlacl http://+:85/demo/webapi user=wszyscy

Oczywiście w zależności od potrzeb modyfikujemy port, resztę linku oraz usera, na którym chcemy pracować (http://msdn.microsoft.com/en-us/library/ms733768.aspx).

Pakiety:

Potrzebujemy również kilka pakietów. W katalogu w którym zapisujemy nasz plik csx wystarczy uruchomić

scriptcs -install scriptcs.webapi

to spowoduje pobranie wszystkiego co będzie potrzebne do webapi.

Kod:

A teraz mięso czyli potrzebujemy System.Net.Http deklarujemy swój kontroler (tutaj TestController), później własny header handler, który przyda się do dodania dodatkoowych nagłówków a to po to, żebyśmy mogli konsumować to api za pomocą ajaxa z dowolnej domeny. Ostatnie 10 linijek to stworzenie serwera i to wszystko.

using System.Net.Http;

public class TestController : ApiController {
    public string Get() {
        return "Hello world!";
    }
}

public class CustomHeaderHandler : DelegatingHandler
{
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,        System.Threading.CancellationToken cancellationToken)
    {
        return base.SendAsync(request, cancellationToken)
               .ContinueWith((task) =>
                {
                    HttpResponseMessage response = task.Result;
                    response.Headers.Add("Access-Control-Allow-Origin", "*");
                    response.Headers.Add("Access-Control-Allow-Methods", "GET");
                    response.Headers.Add("Access-Control-Allow-Headers", "X-Requested-With");
                    return response;
                });
    }
}

var webApi = Require<WebApi>();
var config = new HttpSelfHostConfiguration("http://localhost:85/demo/webapi");
config.MessageHandlers.Add(new CustomHeaderHandler());
var server = webApi.CreateServer(config);

server.OpenAsync().Wait();

Console.WriteLine("Listening...");
Console.ReadLine();
server.CloseAsync().Wait();

odpalamy koda i mamy pod adresem http://localhost:85/demo/webapi serwer, który odpowiada na geta standardowym hello world.

image

wchodzimy z przeglądarki i…

image

czyli webapi odpowiedziało xml-em.

Możemy też wysłąć requesta np z webstorma (lub fiddlera) i zassać jsona:

image

A może ajaxem:

$.ajax({
    url:'http://localhost:85/demo/webapi/test'
}).done(function(response){
    alert(response);
})

image

Całkiem dobry start aby napisać jakiś model backendu w webapi i szybko zacząć prototypować html-e

ScriptCS czyli C# bez ceremonii

O ScriptCS było głośno kilka miesięcy temu (bodajże w marcu) gdy pojawił się na .netowej scenie. W dużym skrócie jest to uskryptowiona wersja  C#-a. To powoduje, że jeśli chcemy zbudował/przetestować kawałek kodu, nie musimy odpalać całego Visuala. Wystarczy napisać:


Console.WriteLine(“hello scriptcs”)

i powinno się wykonać (tak – na końcu nawet nie ma średnika).

Do wykonania powyższego będziemy potrzebowali najnowszych źródeł ScriptCS-a

https://github.com/scriptcs/scriptcs

które należy skompilować (albo przez VS albo za pomocą załączonego build.cmd – osobiście skompilowałem release w visualu i wrzuciłem do c:\scriptCS)

A teraz edytor… a jeśli ma być bez ceremonii i zbędnych ruchów to chcę łatwo uruchomić kawałek napisanego kodu. Sublime Text, którego dość często używam potrafi uruchamiać kod, ale trzeba go skonfigurować – standardowo jest przygotowany na 9 różnych języków ale próżno szukać tam scriptcs-a zatem:

Tools –> Build System –> New build system i dostajemy pusty szablon:

image

pozostaje wskazać co chcemy aby SublimeText zrobił. U mnie wygląda to tak:


{
 "cmd": ["c:\\scriptcs\\scriptcs.exe", "$file"],
 "encoding": "cp1252"
 }

Zapisujemy plik i od teraz w menu mamy:

image

Od teraz można za pomocą Ctrl+B uruchomić nasz eksperymentalny kod w C#

Nie trzeba pisać maina, nie trzeba pisać funkcji czy klas. Poniższe kawałki kodu spokojnie zadzaiłają.


Console.WriteLine("hello scriptcs")

Można też używać samych funkcji


public void HelloWorld(string name){
    Console.WriteLine("Hello {0} !", name);
}

HelloWorld("John");
HelloWorld("Mike");

Nawet klasę to to łyknie Uśmiech


public class HelloWorld{

    public void Say(string name){
        Console.WriteLine("Hello {0} !", name);
    }
}

new HelloWorld().Say("scriptCS")

Od teraz mamy edytor, w którym można szybko i łatwo sprawdzić te kilka linijek kodu z Internetu i zobaczyć czy działają. Można również pisać całe aplikacje albo proste prototypy, zastosować znajdziesz pewnie miliony.

Na moje potrzeby jak na tą chwilę taka konfiguracja jest wystarczająca. Znalazłem również pełniejszą do pobrania tutaj: https://github.com/scriptcs/scriptcs-sublime Nie wiem czy działa, to co zbudowałem przed tym znaleziskiem na razie się sprawdza. Jeśli ktoś to sprawdzi, czekam na feedback.