Il modo migliore per chiamare un servizio Web JSON da una console .NET


89

Sto ospitando un servizio web in ASP.Net MVC3 che restituisce una stringa Json. Qual è il modo migliore per chiamare il servizio web dall'applicazione console ac # e analizzare il ritorno in un oggetto .NET?

Devo fare riferimento a MVC3 nella mia app console?

Json.Net ha alcuni metodi interessanti per serializzare e deserializzare oggetti .NET, ma non vedo che abbia modi per POST e GETing di valori da un servizio web.

O dovrei semplicemente creare il mio metodo di supporto per POST e GET nel servizio web? Come potrei serializzare il mio oggetto .net in coppie di valori chiave?

Risposte:


142

Uso HttpWebRequest per OTTENERE dal servizio Web, che mi restituisce una stringa JSON. Sembra qualcosa di simile per un GET:

// Returns JSON string
string GET(string url) 
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
    try {
        WebResponse response = request.GetResponse();
        using (Stream responseStream = response.GetResponseStream()) {
            StreamReader reader = new StreamReader(responseStream, System.Text.Encoding.UTF8);
            return reader.ReadToEnd();
        }
    }
    catch (WebException ex) {
        WebResponse errorResponse = ex.Response;
        using (Stream responseStream = errorResponse.GetResponseStream())
        {
            StreamReader reader = new StreamReader(responseStream, System.Text.Encoding.GetEncoding("utf-8"));
            String errorText = reader.ReadToEnd();
            // log errorText
        }
        throw;
    }
}

Quindi utilizzo JSON.Net per analizzare dinamicamente la stringa. In alternativa, puoi generare staticamente la classe C # dall'output JSON di esempio utilizzando questo strumento codeplex: http://jsonclassgenerator.codeplex.com/

POST ha questo aspetto:

// POST a JSON string
void POST(string url, string jsonContent) 
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
    request.Method = "POST";

    System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding();
    Byte[] byteArray = encoding.GetBytes(jsonContent);

    request.ContentLength = byteArray.Length;
    request.ContentType = @"application/json";

    using (Stream dataStream = request.GetRequestStream()) {
        dataStream.Write(byteArray, 0, byteArray.Length);
    }
    long length = 0;
    try {
        using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) {
            length = response.ContentLength;
        }
    }
    catch (WebException ex) {
        // Log exception and throw as for GET example above
    }
}

Uso codice come questo nei test automatici del nostro servizio web.


JsonClassGenerator è fantastico. La deserializzazione è semplice in quanto costruisci l'oggetto fortemente tipizzato passando la stringa json.
AaronLS

Se hai caratteri nel set non ASCII, il codice che hai deve essere modificato un po '. ContentLength rappresenta il numero di byte nei contenuti pubblicati, quindi tecnicamente request.ContentLength dovrebbe essere impostato su byteArray.Length, non jsonContent.Length.
Grady Werner,

Encoding.GetEncoding("utf-8")può essere sostituito daEncoding.UTF8
JoelFan

Grazie, questo è molto utile
shweta

Come parte del token di autorizzazione verrà impostato, ma potremmo dover passare anche le intestazioni se richiesto per il test. Come questa richiesta.Method = "GET"; request.Timeout = 20000; request.ContentType = "application / json"; request.Headers.Add ("Authorization", "Bearer your token:
Kurkula

51

WebClient per recuperare i contenuti dall'URL remoto e JavaScriptSerializer o Json.NET per deserializzare JSON in un oggetto .NET. Ad esempio, definisci una classe modello che rifletterà la struttura JSON e quindi:

using (var client = new WebClient())
{
    var json = client.DownloadString("http://example.com/json");
    var serializer = new JavaScriptSerializer();
    SomeModel model = serializer.Deserialize<SomeModel>(json);
    // TODO: do something with the model
}

Ci sono anche alcuni framework client REST che puoi controllare come RestSharp .


@BrokeMyLegBiking, quale? Non ha nulla a che fare con ASPAjax. Se stai parlando della classe JavaScriptSerializer, è costruita in .NET nell'assembly System.Web.Extensions, quindi non devi scaricare o installare nulla.
Darin Dimitrov

C'è un modo per trasformare tutti i nomi / valori delle proprietà dell'oggetto ac # in coppie chiave-valore POST (o coppie chiave-valore GET)? in modo da poter utilizzare efficacemente l'oggetto c # come valore di input per il mio metodo di servizio web?
BrokeMyLegBiking

@BrokeMyLegBiking, dipenderà dall'oggetto che hai e da come il servizio web si aspetta l'input.
Darin Dimitrov

3
Mi è piaciuta molto la libreria RestSharp. Grazie per averlo detto.
Bryan Ray

1
Tesoro, puoi aggiornarlo, client.downloadstring () non è più utilizzabile.
JReam

9

Sebbene le risposte esistenti siano approcci validi, sono antiquate. HttpClient è un'interfaccia moderna per lavorare con i servizi Web RESTful. Controlla la sezione degli esempi della pagina nel link, ha un caso d'uso molto semplice per un HTTP GET asincrono.

using (var client = new System.Net.Http.HttpClient())
{
    return await client.GetStringAsync("https://reqres.in/api/users/3"); //uri
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.