可以对 Quart Schema 进行 PUT 和 GET 调用,但不能进行 POST 调用吗?

问题描述

我正在使用 Quart 和 Quart-Schema 为 Web 应用程序开发 API。对 API 的 GET 和 PUT 调用工作正常。该 API 在托管在 DigitalOcean 上的 Kubernetes 中运行。 docs 页面上的所有调用都可以正常工作。 POST 调用不起作用,我收到的唯一错误消息是 400 BAD REQUEST Bad request or unsupported method。任何输入都是无价的。

以下 PUT curl 工作:

curl -X PUT "https://app.restake.net/api/helper/email" -H  "accept: application/json" -H    "Content-Type: application/json" -d "{\"check\":\"[email protected]\"}"

下面的 POST curl 不起作用:

curl -X POST "https://app.restake.net/api/user" -H  "accept: application/json" -H  "Content-                        Type: application/json" -d "{  \"discord_id\": 02,\"email\": \"string2\",\"password\": \"string\",\"telegram_id\": 02}"

这是负责POST的代码

@app.route("/api/user",methods=['POST'])
@validate_request(User_)
@validate_response(User,201)
async def createNewUser(data: User_) -> User:
"""Create a New User

This creates a new user in the Postgresql database.
"""
result = await psql.createuser(app.pool,asdict(data))
if result is not None:
    return User(**result),201
else:
    abort(404)

我的 dockerfile 如下:

FROM python:3.9.1-slim-buster
workdir /usr/src/app
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
# install system dependencies
RUN apt-get update && apt-get install -y build-essential
RUN pip install --upgrade pip
copY ./requirements.txt /usr/src/app/requirements.txt
RUN pip install -r requirements.txt
copY ./project/ /usr/src/app/project/
copY ./manage.py /usr/src/app/
copY entrypoint.sh .
RUN chmod +x entrypoint.sh
EXPOSE 5000
ENTRYPOINT ["/usr/src/app/entrypoint.sh"]

我的 Kubernetes YAML:

---
apiVersion: v1
kind: Service
Metadata:
  name: dashb-quart
  namespace: restakenet
spec:
  ports:
  - port: 5000
    targetPort: 5000
  selector:
    app: restake
    tier: dashboard
  type: NodePort
---
apiVersion: apps/v1
kind: Deployment
Metadata:
  name: restake-quart-dashboard-dev
  namespace: restakenet
spec:
  replicas: 3
  selector:
    matchLabels:
      app: restake
      tier: dashboard
  template:
    Metadata:
      labels:
        app: restake
        tier: dashboard
    spec:
      containers:
      - name: restake-quart-dashboard-dev
        image: boyroywax/restake-quart-dashboard-dev:latest
        imagePullPolicy: Always
        args: ["hypercorn","--bind","0.0.0.0:5000","manage:app"]
        ports:
        - containerPort: 5000
          name: dashb-qaurt

解决方法

您的请求正文格式不正确。

更新它,使数字没有前导零(或字符串):

{
    "discord_id": 2,"email": "string2","password": "string","telegram_id": 2
}

参考

RFC 4627

2.4.  Numbers

   The representation of numbers is similar to that used in most
   programming languages.  A number contains an integer component that
   may be prefixed with an optional minus sign,which may be followed by
   a fraction part and/or an exponent part.

   Octal and hex forms are not allowed.  Leading zeros are not allowed.
   ...