我正在开发一个与自定义 REST API 交互的 Web 应用程序。它基本上是一个通过应用程序更新的数据表。我尝试使用修补方法进行更新,但是当我发送请求时,Apache 返回 404 错误。
奇怪的是,对同一 URL 的 GET 和 POST 请求工作正常。我可以更改 REST API 的代码作为解决方法,但我的理解是 PATCH 更“正确的“了解我们如何在 API 中使用请求。
一些细节:
Apache 似乎在请求到达自定义 REST API 之前阻止了该请求。我可以在 Apache 访问日志中看到 PATCH 和 GET 请求,但只有 GET 请求出现在自定义 REST API 日志中(FWIW,自定义 REST API 是在烧瓶) 使用古尼康作为托管服务器。
Apache 访问日志记录示例:
192.168.0.1 - 未知 [27/Aug/2021:18:23:27 +0000] “PATCH /admin-api/services/12872 HTTP/1.1” 404 14 “https://www.example.com/admin-dashboard/”...
192.168.0.1 - adminuser [27/8/2021:18:23:43 +0000] "GET /admin-api/services/12872 HTTP/1.1" 200 988 "-" ...
我注意到的一件事是,PATCH 请求将用户名替换为“未知”。这让我相信 CORS 出了问题。我发现了一个“标头“配置缺少 OPTIONS 和 PATCH,所以我添加了它们。仍然看到同样的问题。以下是该选项的当前配置:
Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, PATCH"
我在 Apache 日志或浏览器控制台窗口中没有看到预检 OPTIONS 请求。我尝试使用 Google Chrome (92.0) 和 Firefox (91.0)。
PATCH 请求将“access-control-allow-origin”标头设置为“POST、GET、OPTIONS、PATCH”
Apache 代理配置使用 Unix 套接字代理到 Gunicorn:
<Location /admin-api> ProxyPass unix:/run/admin-api.sock|http://127.0.0.1 </Location>
JavaScript 获取请求:(
apiUrl
和id
是函数中先前设置的变量):let resp = await fetch(`${apiUrl}/services/${id}`, { credentials: "include", method: "PATCH", headers: { "Content-Type": "application/json", Accept: "application/json", }, body: JSON.stringify({ data: { min: 1, max: 3 }, }), });
Apache 版本 2.4.6。我知道技术上Unix 套接字实现于2.4.7,但其他所有功能均正常。我也尝试过切换到“常规”端口,但结果相同。