我正在一个 asp.net 应用程序中工作,试图编写一个 JSON.Net 查询以将记录写入(POST(到API。但是,我在尝试弄清楚如何格式化 json 字符串以将其传递给 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 网站,但还没有奏效。
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
语句中,您可以如何确定服务器返回的确切状态代码以及响应有效负载。您还可以提取响应标头。
使用 Web API 或 MVC API。
如果你想知道区别。
http://encosia.com/asp-net-web-api-vs-asp-net-mvc-apis/
ASP.NET Web API vs. ASP.NET MVC "API" by Dave Ward
简而言之,区别在于:
内容协商灵活性关注点分离