วิธีที่ดีที่สุดในการเรียกใช้บริการ JSON WebService จากคอนโซล. NET


91

ฉันกำลังโฮสต์บริการเว็บใน ASP.Net MVC3 ซึ่งส่งคืนสตริง Json วิธีใดเป็นวิธีที่ดีที่สุดในการเรียกใช้บริการเว็บจากแอปพลิเคชันคอนโซล ac # และแยกวิเคราะห์การส่งคืนเป็นวัตถุ. NET

ฉันควรอ้างอิง MVC3 ในแอปคอนโซลของฉันหรือไม่

Json.Net มีวิธีการที่ดีสำหรับการทำให้เป็นอนุกรมและการแยกซีเรียลออบเจ็กต์. NET แต่ฉันไม่เห็นว่ามันมีวิธีในการโพสต์และรับค่าจากเว็บเซอร์

หรือฉันควรสร้างวิธีการช่วยเหลือของตัวเองสำหรับการโพสต์และเข้าสู่บริการเว็บ ฉันจะทำให้ออบเจ็กต์. net เป็นอนุกรมกับคู่คีย์ค่าได้อย่างไร

คำตอบ:


144

ฉันใช้ HttpWebRequest เพื่อรับจากบริการเว็บซึ่งส่งคืนสตริง JSON ให้ฉัน ดูเหมือนว่าสิ่งนี้สำหรับ 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;
    }
}

จากนั้นฉันใช้JSON.Netเพื่อแยกวิเคราะห์สตริงแบบไดนามิก หรือคุณสามารถสร้างคลาส C # แบบคงที่จากเอาต์พุต JSON ตัวอย่างโดยใช้เครื่องมือ codeplex นี้: http://jsonclassgenerator.codeplex.com/

POST มีลักษณะดังนี้:

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

ฉันใช้รหัสแบบนี้ในการทดสอบบริการเว็บของเราโดยอัตโนมัติ


JsonClassGenerator สุดยอดมาก Deserialization ทำได้ง่ายเพียงแค่สร้างอ็อบเจกต์ที่พิมพ์มากโดยส่งสตริง json
AaronLS

หากคุณมีอักขระในชุดที่ไม่ใช่ ascii รหัสที่คุณมีจะต้องได้รับการแก้ไขเล็กน้อย ContentLength แสดงถึงจำนวนไบต์ในเนื้อหาที่โพสต์ดังนั้นในทางเทคนิค request.ContentLength ควรตั้งค่าเป็น byteArray.Length ไม่ใช่ jsonContent.Length
Grady Werner

Encoding.GetEncoding("utf-8")สามารถแทนที่ได้โดยEncoding.UTF8
JoelFan

ขอบคุณสิ่งนี้มีประโยชน์มาก
shweta

เนื่องจากเป็นส่วนหนึ่งของโทเค็นการอนุญาตจะถูกตั้งค่า แต่เราอาจต้องส่งส่วนหัวด้วยหากจำเป็นต้องทดสอบ เช่นนี้ request.Method = "GET"; request.Timeout = 20000; request.ContentType = "แอปพลิเคชัน / json"; request.Headers.Add ("Authorization", "Bearer your token:
Kurkula

51

WebClientเพื่อดึงเนื้อหาจากรีโมต url และJavaScriptSerializerหรือJson.NETเพื่อแยกข้อมูล JSON ลงในอ็อบเจ็กต์. NET ตัวอย่างเช่นคุณกำหนดคลาสโมเดลซึ่งจะแสดงโครงสร้าง JSON จากนั้น:

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
}

นอกจากนี้ยังมีบางกรอบลูกค้า REST คุณอาจชำระเงินเช่นRestSharp


@BrokeMyLegBiking อันไหน? ไม่มีส่วนเกี่ยวข้องกับ ASPAjax หากคุณกำลังพูดถึงคลาส JavaScriptSerializer มันถูกสร้างขึ้นใน. NET ในแอสเซมบลี System.Web.Extensions ดังนั้นคุณไม่ต้องดาวน์โหลดหรือติดตั้งอะไรเลย
Darin Dimitrov

มีวิธีเปลี่ยนชื่อคุณสมบัติ / ค่าคุณสมบัติทั้งหมดของวัตถุ ac # เป็นคู่คีย์ - ค่า POST (หรือรับคู่คีย์ - ค่า) หรือไม่ เพื่อให้ฉันสามารถใช้อ็อบเจกต์ c # เป็นค่าอินพุตของวิธีการบริการเว็บได้อย่างมีประสิทธิภาพ?
BrokeMyLegBiking

@BrokeMyLegBiking ซึ่งจะขึ้นอยู่กับวัตถุที่คุณมีและบริการเว็บคาดหวังการป้อนข้อมูลอย่างไร
Darin Dimitrov

3
ฉันสนุกกับห้องสมุด RestSharp มาก ขอบคุณที่พูดถึงเรื่องนั้น
Bryan Ray

1
Daren คุณสามารถอัปเดตสิ่งนี้ได้ client.downloadstring () ใช้งานไม่ได้อีกต่อไป
JReam

9

แม้ว่าคำตอบที่มีอยู่จะเป็นแนวทางที่ถูกต้อง แต่ก็เป็นแนวทางที่ล้าสมัย HttpClientเป็นอินเทอร์เฟซที่ทันสมัยสำหรับการทำงานกับบริการบนเว็บ RESTful ตรวจสอบส่วนตัวอย่างของหน้าในลิงก์ซึ่งมีกรณีการใช้งานที่ตรงไปตรงมามากสำหรับ HTTP GET แบบอะซิงโครนัส

using (var client = new System.Net.Http.HttpClient())
{
    return await client.GetStringAsync("https://reqres.in/api/users/3"); //uri
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.