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 站点的请求的最佳方法是啥?

2021-06-20 .NET高级班 59-ASP.NET Core 后端请求API封装(HttpClient版)

ASP.NET MVC 4 HttpClient() 问题

java用httpClient post方式传数据,ASP.NET怎么接收数据?