【问题标题】:Writing to a 3rd party API写入第 3 方 API
【发布时间】:2013-08-27 16:08:22
【问题描述】:

我正在尝试编写 JSON.Net 查询以将记录写入 (POST) 到 API 的 asp.net 应用程序。但是,我在尝试弄清楚如何格式化 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 website,但没有任何效果。

【问题讨论】:

标签: c# asp.net api json.net


【解决方案1】:

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 语句中,您如何确定服务器返回的确切状态代码以及响应负载。您还可以提取响应标头。

【讨论】:

  • 谢谢@Darin。我会试试这个。
  • @Darin,我在 client.UploadData(url, data) 处得到“未经授权”。令牌 API 是正确的。有什么想法吗?
  • 我猜您提供了无效/过期的 Bearer OAuth 令牌。您似乎在评论中提到该令牌是正确的,但是如果 API 不接受它并抛出 401,是什么让您这么认为?
  • 好吧,上面显示的令牌不准确(出于安全考虑)。我(在我的应用程序中)拥有的令牌是正确的,并且已经过供应商的验证。供应商是非 .net 商店,因此他们无法提供 .net 支持
  • 我从来没有怀疑过这一点。此处显示的代码应执行正确的 HTTP 请求。
【解决方案2】:

使用 Web API 或 MVC API。

如果你想知道区别。

http://encosia.com/asp-net-web-api-vs-asp-net-mvc-apis/

Dave Ward 的 ASP.NET Web API 与 ASP.NET MVC “API”

简而言之,区别在于:

内容协商 灵活性 关注点分离

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多