【问题标题】:HTTP Client Patch method with Asp.net core 2.1, bad request使用 Asp.net core 2.1 的 HTTP 客户端补丁方法,错误请求
【发布时间】:2022-01-08 01:09:19
【问题描述】:

使用HttpClient 执行 PATCH 方法请求时出现错误请求错误

var patchDoc = new JsonPatchDocument<ClientOrganisationRequestArgs>();
patchDoc.Replace(e => e.Name, clientOrganisationRequestArgs.Name);
var serializedDoc = JsonConvert.SerializeObject(patchDoc);
var requestContent = new StringContent(serializedDoc, Encoding.UTF8, "application/json-patch+json");

var httpResponseMessage = await _httpClient.PatchAsync(
    $"api/orgs/{clientOrganisationRequestArgs.ClientRefId}", requestContent);

型号

public class ClientOrganisationRequestArgs
{
    public int ClientRefId { get; set; }        
    public string Name { get; set; }
    public string DefaultTimezone => "AUSTRALIA/SYDNEY";
    public string CustomStylePath { get; set; }
}

请求错误时获得 400

Postman 还显示 500 内部服务器错误,正文为原始内容

授权和接受标头

_httpClient.DefaultRequestHeaders.Add(
                HeaderNames.Accept, "application/vnd.yellowfin.api-v1.3+json");
_authorizationHeader =
                $"{_authorizationHeader}, token={accessToken.SecurityToken}";
            
            _httpClient.DefaultRequestHeaders.TryAddWithoutValidation(
                HeaderNames.Authorization, _authorizationHeader);

【问题讨论】:

  • 授权头和接受头是否发送正确?
  • 根据显示的文档,它期望简单的 application/json 内容类型标头,但您有 application/json-patch+json 作为内容类型

标签: c# asp.net asp.net-mvc asp.net-core asp.net-core-2.1


【解决方案1】:

您有 application/json-patch+json 作为内容类型

//...

var requestContent = new StringContent(serializedDoc, Encoding.UTF8, "application/json-patch+json");

//...

但根据显示的文档,它需要简单的 application/json 内容类型标题

var requestContent = new StringContent(serializedDoc, Encoding.UTF8, "application/json");

同样基于所示文档中的示例,有效负载是一个纯 JSON 文档,看起来并不真正遵循 JSON Patch 文档格式。这可能会导致 API 无法识别请求内容。

我建议序列化有效负载以匹配给定的示例

string serializedDoc = JsonConvert.SerializeObject(clientOrganisationRequestArgs);

StringContent requestContent = new StringContent(serializedDoc, Encoding.UTF8, "application/json");

string url = $"api/orgs/{clientOrganisationRequestArgs.ClientRefId}";

var httpResponseMessage = await _httpClient.PatchAsync(url, requestContent);

假设

public class ClientOrganisationRequestArgs {
    [JsonProperty("clientRefId")]
    public int ClientRefId { get; set; }
    [JsonProperty("name")]
    public string Name { get; set; }
    [JsonProperty("defaultTimezone")]
    public string DefaultTimezone => "AUSTRALIA/SYDNEY";
    [JsonProperty("customStylePath")]
    public string CustomStylePath { get; set; }
}

【讨论】:

  • 我收到 500 个内部服务器错误,不知道是什么原因
  • @SanJaisy 你能调试一下看看实际的错误/异常是什么。 500 可以是任何东西
  • 我怎样才能用那个 httpcall 调试出什么问题。在 HttpClient 我只有 public Task PatchAsync(string requestUri, HttpContent content);没有实现,不知道怎么调试
猜你喜欢
  • 2021-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-20
  • 1970-01-01
  • 1970-01-01
  • 2010-09-12
相关资源
最近更新 更多