Google Cloud Run 未记录 DEL 请求的 502 响应

如何解决Google Cloud Run 未记录 DEL 请求的 502 响应

我创建了一个非常简单的 Google Cloud Run Python 服务来试验 Restful API:

import os
from flask import Flask

app = Flask(__name__)

@app.route('/user/<user_name>',methods=['PUT'])
def create_user(user_name):
    return 'created!',200

@app.route('/user/<user_name>',methods=['DEL'])
def delete_user(user_name):
    return 'deleted!',200

if __name__ == "__main__":
    app.run(debug=True,host="0.0.0.0",port=int(os.environ.get("PORT",8080)))

我已成功使用此 Dockerfile 将此服务部署到 Cloud Run。

为了测试服务,我使用 curl 来访问部署的端点:

$curl -X PUT https://testapi.xxxxxxxx.a.run.app/user/prl900
created!

但是,DEL 请求会导致 502 错误,而且奇怪的是,这并未记录在 Cloud Run 的日志记录平台中。

$curl -X DEL https://testapi.xxxxxxxx.a.run.app/user/prl900
...
...
<p><b>502.</b> <ins>That’s an error.</ins>
  <p>The server encountered a temporary error and Could not complete your request.<p>Please try again in 30 seconds.  <ins>That’s all we kNow.</ins>

所有其他方法都被拒绝并按预期正确记录在后端:

$curl -X PATCH https://testapi.xxxxxxxx.a.run.app/user/prl900
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>405 Method Not Allowed</title>
<h1>Method Not Allowed</h1>
<p>The method is not allowed for the requested URL.</p>

谁能理解 Cloud Run 无法处理 DEL 请求且未记录它们的原因? Cloud Run 上的 DEL 请求有什么特别之处吗?该服务在我的本地计算机上运行良好。

感谢您的帮助

解决方法

正确的 HTTP 动词是 DELETE 而不是 DEL。您需要将您的烧瓶路线更改为:

@app.route('/user/<user_name>',methods=['DELETE'])

然后正确的 curl 命令将是:

curl -X DELETE https://testapi.xxxxxxxx.a.run.app/user/prl900

使用非标准动词会导致位于您的服务前面的 gcloud 基础设施中的某些代理拒绝路由请求。这解释了 502(坏网关)以及日志不显示的原因(它永远不会到达您的服务)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?