Cách tốt nhất để gọi một JSON WebService từ .NET Console


89

Tôi đang lưu trữ một dịch vụ web trong ASP.Net MVC3 trả về một chuỗi Json. Cách tốt nhất để gọi webservice từ ứng dụng ac # console và phân tích cú pháp trả về thành một đối tượng .NET là gì?

Tôi có nên tham chiếu MVC3 trong ứng dụng bảng điều khiển của mình không?

Json.Net có một số phương pháp hay để tuần tự hóa và giải mã hóa các đối tượng .NET, nhưng tôi không thấy rằng nó có các cách để ĐĂNG và NHẬN các giá trị từ một dịch vụ web.

Hay tôi chỉ nên tạo phương thức trợ giúp của riêng mình để ĐĂNG và TẢI dịch vụ web? Làm cách nào để tuần tự hóa đối tượng .net của tôi thành các cặp giá trị khóa?

Câu trả lời:


141

Tôi sử dụng HttpWebRequest để NHẬN từ dịch vụ web, dịch vụ này trả về cho tôi một chuỗi JSON. Nó trông giống như thế này cho một 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;
    }
}

Sau đó, tôi sử dụng JSON.Net để phân tích cú pháp động chuỗi. Ngoài ra, bạn có thể tạo lớp C # tĩnh từ đầu ra JSON mẫu bằng công cụ codeplex này: http://jsonclassgenerator.codeplex.com/

POST trông giống như sau:

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

Tôi sử dụng mã như thế này trong các thử nghiệm tự động của dịch vụ web của chúng tôi.


JsonClassGenerator thật tuyệt vời. Việc gỡ bỏ số liệu rất dễ dàng vì bạn chỉ cần xây dựng đối tượng được gõ mạnh bằng cách chuyển chuỗi json.
AaronLS, 11/12/12

Nếu bạn có các ký tự trong bộ không phải ascii, mã bạn có cần được thay đổi một chút. ContentLength đại diện cho số byte trong nội dung được đăng, vì vậy về mặt kỹ thuật, request.ContentLength phải được đặt thành byteArray.Length, không phải jsonContent.Length.
Grady Werner

Encoding.GetEncoding("utf-8")có thể được thay thế bằngEncoding.UTF8
JoelFan

Cảm ơn, Điều này rất hữu ích
shweta

Là một phần của Mã thông báo ủy quyền sẽ được thiết lập nhưng Chúng tôi cũng có thể phải chuyển tiêu đề nếu được yêu cầu để kiểm tra. Giống như request này.Method = "GET"; request.Timeout = 20000; request.ContentType = "application / json"; request.Headers.Add ("Ủy quyền", "
Mang

51

WebClient để tìm nạp nội dung từ url từ xa và JavaScriptSerializer hoặc Json.NET để giải mã JSON thành đối tượng .NET. Ví dụ: bạn xác định một lớp mô hình sẽ phản ánh cấu trúc JSON và sau đó:

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
}

Ngoài ra còn có một số khuôn khổ máy khách REST mà bạn có thể kiểm tra như RestSharp .


@BrokeMyLegBiking, cái nào? Nó không liên quan gì đến ASPAjax. Nếu bạn đang nói về lớp JavaScriptSerializer, nó được xây dựng trong .NET trong hợp ngữ System.Web.Extensions, do đó bạn không phải tải xuống hoặc cài đặt bất kỳ thứ gì.
Darin Dimitrov

Có cách nào để biến tất cả các tên thuộc tính / giá trị thuộc tính của đối tượng ac # thành các cặp khóa-giá trị POST (hoặc GET các cặp khóa-giá trị) không? để tôi có thể sử dụng hiệu quả đối tượng c # làm giá trị đầu vào cho phương thức webservice của mình?
BrokeMyLegBiking

@BrokeMyLegBiking, điều đó sẽ phụ thuộc vào đối tượng bạn có và dịch vụ web mong đợi đầu vào như thế nào.
Darin Dimitrov

3
Tôi thực sự rất thích thư viện RestSharp. Cảm ơn vì đã đề cập đến điều đó.
Bryan Ray

1
Daren bạn có thể cập nhật cái này không, client.downloadstring () không còn khả thi nữa.
JReam

9

Mặc dù các câu trả lời hiện có là cách tiếp cận hợp lệ, nhưng chúng đã lỗi thời. HttpClient là một giao diện hiện đại để làm việc với các dịch vụ web RESTful. Kiểm tra phần ví dụ của trang trong liên kết, nó có một trường hợp sử dụng rất đơn giản cho HTTP GET không đồng bộ.

using (var client = new System.Net.Http.HttpClient())
{
    return await client.GetStringAsync("https://reqres.in/api/users/3"); //uri
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.