ASP.NET HttpClient 请求返回 409 错误
Posted
技术标签:
【中文标题】ASP.NET HttpClient 请求返回 409 错误【英文标题】:ASP.NET HttpClient request returns 409 Error 【发布时间】:2019-02-03 07:22:58 【问题描述】:我正在像这样进行 HTTP 调用:
[HttpGet]
public HttpResponseMessage updateRegistrant(string token, string registrantId, string firstname, string lastname, string postalCode, string phoneNumber, string city, string email)
using (HttpClient httpClient = new HttpClient())
httpClient.BaseAddress = new Uri("https://api.example.com/v1/registrants/" + registrantId + "/");
httpClient.DefaultRequestHeaders.Accept.Clear();
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Put, "person/contact-information");
request.Content = new StringContent("\"firstName\":\"" + firstname + "\", \"lastName\":\"" + lastname + "\", \"phones\":[\"phone\":\"" + phoneNumber + "\", \"type\":\"Home\", \"primary\":true], \"emails\":[\"email\":\"" + email + "\", \"type\":\"Personal\", \"primary\":true], \"addresses\":[\"city\":\"" + city + "\", \"zipCode\":\"" + postalCode + "\"]", Encoding.UTF8, "application/json");
//request.Content = new StringContent("\"firstName\":\"" + firstname + "\", \"lastName\":\"" + lastname + "\"", Encoding.UTF8, "application/json");
HttpResponseMessage response = httpClient.SendAsync(request).Result;
return response;
现在,当我运行此方法时,我会收到 409 错误调用,但是如果我注释掉第一个 request.Content 并取消注释第二个 request.Content 它可以工作,我会收到 200 的响应代码。
我认为这些是导致 409 错误的原因:
\"phones\":[\"phone\":\"" + phoneNumber + "\", \"type\":\"Home\", \"primary\":true]
但是为什么以及如何解决这个问题?
【问题讨论】:
我建议不要手动构建 JSON,而是从 C# 对象序列化它。 无论如何,这里提到了 409 的可能原因:developer.mozilla.org/en-US/docs/Web/HTTP/Status/409 和网络上的其他地方。老实说,如果没有看到服务器代码,您的服务器返回的原因就不清楚了。大概它不喜欢您的输入。是否有任何文本与状态码一起返回,这可能有助于解释它? 顺便说一句,您这里没有使用 cURL,您显然使用的是 C# 和 HttpClient。 cURL 是一个完全独立的软件。它也可以用来发出 HTTP 请求,但你没有使用它,所以我不确定你为什么要标记它或根本没有提到它。我已编辑问题以更正您的术语。 您调用的 API 是否提供文档?他们应该记录可能的退货状态和原因。 【参考方案1】:与其尝试手动构建 JSON 字符串,不如考虑这样的方法。
string firstname = "";
string lastName = "";
string phoneNumber = "";
string primary = "";
string phoneNumber2 = "";
var registrant = new
firstName = firstname,
lastName = lastName,
phones = new[]
new phone = phoneNumber, type = "Home", primary = true ,
new phone = phoneNumber2, type = "Work", primary = false
;
javascriptSerializer js = new JavaScriptSerializer();
string jsonData = js.Serialize(registrant);
以您可以更轻松地自行排除故障的方式构建您的请求,可以帮助您回答自己的问题并具体找出导致错误的数据部分。它还可以帮助您在构建 JSON 时避免任何基本的拼写错误。
409 可以是任何东西。检查响应对象以获取可能包含更多信息的人类可读错误消息。通常,这意味着您更新的数据与某些内容发生冲突。电话、地址等。从已知的工作请求开始,一次添加一个元素。
如果您可以具体缩小导致服务器返回 409 的数据的范围,请返回并更仔细地查看他们的 API 文档。你在正确的轨道上。
【讨论】:
以上是关于ASP.NET HttpClient 请求返回 409 错误的主要内容,如果未能解决你的问题,请参考以下文章
Asp.Net Web API 2第四课——HttpClient消息处理器
从 ASP.net 4 Web API 2 项目通过 HttpClient 调用 REST 服务导致异常
使用 HttpClient 压缩对 asp.net core 2 站点的请求的最佳方法是啥?