c# - 从 Postman 发送 Json 返回代码 200,从 HttpClient 发送 Json 返回 503(您的分块 POST 数据太大无法上传)
问题描述
我正在使用他们的地址验证调用(https://onlinetools.ups.com/rest/AV)向 UPS 进行 api 调用。我之前曾成功从 UPS 调用不同的 Gets(例如:UPS Address Steen Level Validation)。
这是正在发送的json:
{
"AccessRequest": {
"AccessLicenseNumber": "removed for security reasons",
"UserId": "removed for security reasons",
"Password": "removed for security reasons"
},
"AddressValidationRequest": {
"Request": {
"TransactionReference": {
"CustomerContext": ""
},
"RequestAction": "AV"
},
"Address": {
"City": "",
"StateProvinceCode": "",
"PostalCode": "98272"
}
}
}
在 PostMan 中,只有默认的 Headers 被使用:
这将使用我正在查找的数据成功返回,代码为:200。
在我的 .Net Standard 2.0 库中,我使用 HTTPClient(Microsoft.AspNet.WebApi.Client 5.2.7) 来调用 api。下面是我如何启动 HTTP 客户端(名为“ApiClient”的变量):
string api = _config["UPS_API_LINK"];
_apiClient = new HttpClient();
_apiClient.BaseAddress = new Uri(api);
_apiClient.DefaultRequestHeaders.Accept.Clear();
_apiClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
现在我已经创建了要排列的模型,因此它发送的 Json 与 Postman 发送的 Json 完全相同。您将在下面的代码中看到,我通过自己对其进行序列化来仔细检查(我获取该字符串,将其复制到邮递员中,并像魅力一样工作)。所以我发送我的请求。我稍微缩短了代码来说明我的观点:
string json = JsonConvert.SerializeObject(request);
Debug.Print(json);
using (HttpResponseMessage response = await ApiClient.PostAsJsonAsync("/rest/AV", request))
{
var content = await response.Content.ReadAsStringAsync();
}
以下是内容返回的内容:
<HTML><HEAD><TITLE>Weblogic Bridge Message</TITLE></HEAD> <BODY><H2>Failure of Web Server bridge:</H2><P><hr>Your chunked POST data is too large to upload.<hr> </BODY></HTML>
返回码是 503。那么有人可以引导我走向正确的方向吗?我只是不知道 HTTP 客户端发送的是什么让它变得如此之大以至于我得到了这个响应。令我惊讶的是,我对发送更多数据的 api 进行了另一个调用,并且它运行良好。任何建议,将不胜感激。
更新:感谢 Nehorai,我发现我可以使用名为 RestSharp 的第三方 dll 进行 Api 调用。这个库完美无缺!虽然我很想知道为什么 HTTP 客户端在这种情况下不起作用。这是我下面使用 RestSharp 的代码,以防有人想看它:
var client = new RestClient("https://onlinetools.ups.com/rest/AV");
client.Timeout = -1;
var requestRest = new RestRequest(Method.POST);
requestRest.AddHeader("Content-Type", "application/json");
requestRest.AddJsonBody(request);
var result = await client.ExecutePostAsync<ZipInfo_RootResponse>(requestRest);
解决方案
推荐阅读
- vue.js - 如何更改 nuxt.js 中的 vue-intro.js css
- web-crawler - 微服务可以根据资源使用情况进行拆分吗?
- java - 以编程方式设置约束布局的比例 x 和 y 以适应任何设备中的屏幕
- app-store - 自制的 Android 应用程序不适合所有人,仅供公司使用
- sql - 使用 .net 从 MS Access 数据库中删除不存在的记录
- nextcloud - 无法上网 Nextcloud Connection Assistant
- python - Asyncio 服务器 - 如何通过访问 recipent 客户端的 writer 对象在两个客户端之间正确传达消息?
- django - 我是否必须使用 Django 模型才能使用 API?
- django - keep_lazy 用于通过 Django API 发送的翻译消息
- dataframe - 如何在pyspark中获得平均值?