Cara terbaik untuk memanggil JSON WebService dari .NET Console

90

Saya meng-hosting layanan web di ASP.Net MVC3 yang mengembalikan string Json. Apa cara terbaik untuk memanggil layanan web dari aplikasi konsol ac #, dan mengurai kembali ke objek .NET?

Haruskah saya mereferensikan MVC3 di aplikasi konsol saya?

Json.Net memiliki beberapa metode bagus untuk membuat serial dan deserialisasi objek .NET, tetapi saya tidak melihat bahwa ia memiliki cara untuk POST dan MENDAPAT nilai dari webservice.

Atau haruskah saya membuat metode pembantu saya sendiri untuk POST dan MENDAPATKAN ke layanan web? Bagaimana cara membuat serialisasi objek .net saya menjadi pasangan nilai kunci?

BrokeMyLegBiking
sumber

Jawaban:

143

Saya menggunakan HttpWebRequest untuk MENDAPATKAN dari layanan web, yang mengembalikan saya string JSON. Ini terlihat seperti ini untuk 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;
    }
}

Saya kemudian menggunakan JSON.Net untuk mengurai string secara dinamis. Atau, Anda dapat membuat kelas C # secara statis dari contoh keluaran JSON menggunakan alat codeplex ini: http://jsonclassgenerator.codeplex.com/

POST terlihat seperti ini:

// 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
    }
}

Saya menggunakan kode seperti ini dalam pengujian otomatis layanan web kami.

GarethOwen
sumber
JsonClassGenerator luar biasa. Deserialisasi itu mudah karena Anda hanya membuat objek yang diketik dengan kuat dengan meneruskan string json.
AaronLS
Jika Anda memiliki karakter dalam set non-ascii, kode yang Anda miliki perlu sedikit diubah. ContentLength mewakili jumlah byte dalam konten yang diposting, jadi secara teknis request.ContentLength harus disetel ke byteArray.Length, bukan jsonContent.Length.
Grady Werner
Encoding.GetEncoding("utf-8")dapat diganti denganEncoding.UTF8
JoelFan
Terima kasih, Ini sangat membantu
shweta
Sebagai bagian dari token Otorisasi akan ditetapkan tetapi Kami mungkin juga harus memberikan header jika diperlukan untuk menguji. Seperti request.Method = "GET"; request.Timeout = 20000; request.ContentType = "application / json"; request.Headers.Add ("Otorisasi", "
Membawa
51

WebClient untuk mengambil konten dari url jarak jauh dan JavaScriptSerializer atau Json.NET untuk membatalkan panggilan JSON menjadi objek .NET. Misalnya Anda menentukan kelas model yang akan mencerminkan struktur JSON dan kemudian:

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
}

Ada juga beberapa kerangka kerja klien REST yang dapat Anda periksa seperti RestSharp .

Darin Dimitrov
sumber
@BrokeMyLegBiking, yang mana? Ini tidak ada hubungannya dengan ASPAjax. Jika Anda berbicara tentang kelas JavaScriptSerializer itu dibangun di .NET di perakitan System.Web.Extensions sehingga Anda tidak perlu mengunduh atau menginstal apa pun.
Darin Dimitrov
Apakah ada cara untuk mengubah semua nama properti / nilai properti objek ac # menjadi pasangan nilai kunci POST (atau GET pasangan nilai kunci)? sehingga saya dapat secara efektif menggunakan objek c # sebagai nilai input untuk metode webservice saya?
BrokeMyLegBiking
@BrokeMyLegBiking, itu akan bergantung pada objek apa yang Anda miliki dan bagaimana layanan web mengharapkan masukan.
Darin Dimitrov
3
Saya sangat menikmati perpustakaan RestSharp. Terima kasih telah menyebutkannya.
Bryan Ray
1
Daren dapat Anda perbarui ini, client.downloadstring () tidak lagi layak.
JReam
9

Meskipun jawaban yang ada merupakan pendekatan yang valid, namun sudah kuno. HttpClient adalah antarmuka modern untuk bekerja dengan layanan web RESTful . Periksa bagian contoh halaman di tautan, ini memiliki kasus penggunaan yang sangat mudah untuk HTTP GET asynchronous.

using (var client = new System.Net.Http.HttpClient())
{
    return await client.GetStringAsync("https://reqres.in/api/users/3"); //uri
}
LostNomad311
sumber