Angular lazyUpdate 中的 HttpClient 补丁 Headers

Angular HttpClient Patch Headers in lazyUpdate

在我的 Angular 项目中,我使用的是 HttpClient (@angular/common/http)。 我使用 POST、GET 和 DELETE 方法成功地执行了很多 API 请求,始终发送到相同的后端 URL 并包括相同的 headers(不记名身份验证)。 一旦我执行 PATCH 请求(相同 URL,相同 headers),服务器就会抱怨“401 未授权”状态。 我检查了 headers 是否与 PATCH 一起正确发送,但它们不是。 当对请求使用以下代码片段时,我发送的 headers 以某种方式设置在 Headers 的 lazyUpdate 部分(但仅适用于 PATCH。POST、GET、DELETE 工作正常) ,这是不正确的:

let headers = new HttpHeaders();
headers = headers.
  set('content-type', 'application/json').
  set('Authorization', 'Bearer <myToken>');

this.httpClient.patch(<my_patch_url>, { 'headers': headers });

另一方面,当使用以下代码时,headers 设置正确,但仍然无法识别:

const headers = {
      'content-type': 'application/json',
      'Authorization': 'Bearer <myToken>')
    }

this.httpClient.patch(<my_patch_url>, { 'headers': headers });

因此除了 PATCH 请求外,一切正常。

有人知道为什么 PATCH 以错误的方式发送 headers 吗?

提前致谢。 干杯

我自己找到了解决这个问题的方法:

这与您如何添加 header 无关,而是使用 PATCH 方法的请求可能还需要一个 body 来反映实际应该更新的参数(@param body — 要编辑的资源)。

参见 PATCH 的定义:

(method) HttpClient.patch(url: string, body: any, options?: {
    headers?: HttpHeaders | {
        [header: string]: string | string[];
    };

这个有效:

const headers = {
      'content-type': 'application/json',
      'Authorization': 'Bearer <myToken>')
    }

this.httpClient.patch(patch_url, "", { 'headers': headers });

在我的例子中,body 部分是空的 (""),因为后端不接受任何其他内容。