2013-08-27 65 views
3

我正在尝试编写JSON.Net查询以将写入(POST)记录写入API的asp.net应用程序中工作。但是,我在试图弄清楚如何格式化json字符串以将其传递给API时遇到问题。写入第三方API

供应商支持页面上的“示例”具有以下标题信息。

POST /extact/api/profiles/114226/pages/423833/records HTTP/1.1 
Host: server.iPadDataForm.com 
Authorization: Bearer 6bfd44fbdcdddc11a88f8274dc38b5c6f0e5121b 
Content-Type: application/json 
X-IFORM-API-REQUEST-ENCODING: JSON 
X-IFORM-API-VERSION: 1.1 

问:
如果我使用JSON.Net,我怎么传递给API的报头信息?我看过json.net website,但没有任何工作。

+0

http://stackoverflow.com/a/6055838/264607 – BlackICE

回答

4

JSON.NET是用于将.NET对象序列化并反序列化为JSON的库。它与发送HTTP请求无关。你可以使用WebClient来达到这个目的。

例如这里是你如何可以调用API:

string url = "http://someapi.com/extact/api/profiles/114226/pages/423833/records"; 
using (var client = new WebClient()) 
{ 
    client.Headers[HttpRequestHeader.Authorization] = "Bearer 6bfd44fbdcdddc11a88f8274dc38b5c6f0e5121b"; 
    client.Headers[HttpRequestHeader.ContentType] = "application/json"; 
    client.Headers["X-IFORM-API-REQUEST-ENCODING"] = "JSON"; 
    client.Headers["X-IFORM-API-VERSION"] = "1.1"; 

    MyViewModel model = ... 
    string jsonSerializedModel = JsonConvert.Serialize(model); // <-- Only here you need JSON.NET to serialize your model to a JSON string 

    byte[] data = Encoding.UTF8.GetBytes(jsonSerializedModel); 
    byte[] result = client.UploadData(url, data); 

    // If the API returns JSON here you could deserialize the result 
    // back to some view model using JSON.NET 
} 

UploadData方法将发送一个HTTP POST请求发送到远程端点。如果你想处理异常,你可以把它放在一个try/catch块中,并捕获WebException,这是这个方法可能抛出的,例如,如果远程端点返回一些非2xx HTTP响应状态码。

这里是你如何能处理异常和阅读在这种情况下远程服务器响应:

try 
{ 
    byte[] result = client.UploadData(url, data); 
} 
catch (WebException ex) 
{ 
    using (var response = ex.Response as HttpWebResponse) 
    { 
     if (response != null) 
     { 
      HttpStatusCode code = response.StatusCode; 
      using (var stream = response.GetResponseStream()) 
      using (var reader = new StreamReader(stream)) 
      { 
       string errorContent = reader.ReadToEnd(); 
      } 
     } 
    } 
} 

注意如何在catch声明,你可以决定由服务器返回以及响应的确切状态码有效载荷。你也可以提取响应头文件。

+0

谢谢@Darin。我会试试这个。 – Csharp

+0

所有的工作,只有一个+1,吝啬的堆垛机! +1 – Pinch

+0

@Darin,我得到“未经授权”在client.UploadData(网址,数据)。令牌API是正确的。有关于此的任何想法? – Csharp