Lumen API returns 将正文作为 JSON 传递时出现 422 错误

Lumen API returns 422 error when passing body as JSON

我正在尝试 post 通过 fetch api.

从 React 应用程序到 php 后端(Lumen 5.3)

我的POST如下:

function login(userData, onError, cb) {
  return fetch('/v1/auth/login', {
    method: 'post',
    body: JSON.stringify(userData),
    headers: {
      'Accept': 'application/json',
      'Content-Type': 'application/json',
    },
  }).then(checkStatus)
    .then(parseJSON)
    .then(cb)
    .catch(onError);
}

其中 userData 是:

const userData = {
  email: this.state.fields.username,
  password: this.state.fields.password,
};

但是我收到一个错误:

哪个说明我的身材不对?我怀疑这是因为当我在 postman 中测试一个等效请求并且不在正文中传递 password 时,我将收到 422 错误:

这让我相信正文的格式可能不正确?

一个有点可疑的部分是,如果我从 php 后端记录我的响应,则没有返回正文。理论上,如果我的正文格式不正确,我应该从后端收到以下内容:

{
    "email": [
        "The email field is required."
    ],
    "password": [
        "The password field is required."
    ]
}

原来我的流明API不接受JSON作为正文

目前的解决方法是修改我的请求如下:

function login(userData, onError, cb) {
  return fetch('/v1/auth/login', {
    method: 'post',
    body: serialize(userData), // no longer passing json
    headers: {
      'Accept': 'application/json',
      'Content-Type': 'application/x-www-form-urlencoded' // no longer passing json
    },
  }).then(checkStatus)
    .then(parseJSON)
    .then(cb)
    .catch(onError);
}

function serialize(obj) {
  let str = [];
  for(let p in obj)
    if (obj.hasOwnProperty(p)) {
      str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
    }
  return str.join("&");
}

其中 userData 是:

const userData = {
  email: this.state.fields.username,
  password: this.state.fields.password,
};

现在大家都很开心 :) 希望这对您有所帮助!