我正在将旧版 php 服务器传递给节点。我有这个 php guzzle http 请求到一些仪表板:
$request = $this->http_client->request('POST',
$url,
[ 'headers' => ['Content-type: application/x-www-form-urlencoded'],
'form_params' => [
'authenticity_token'=> $authKey,
'affiliate_user_session[login]'=>$this->partner->username,
'affiliate_user_session[password]'=>$this->partner->password,
'commit'=>'Log In to Portal'
]
]
);
它工作正常,我收到了我的响应数据。
但是当我尝试在节点服务器中执行相同的请求时,我收到错误 422 - 无法处理的实体,据我了解,这意味着请求中存在一些语法错误。
节点axios中的代码:
const postResponse = await axios.post(
url,
{
'authenticity_token': authKey,
'affiliate_user_session[login]': name,
'affiliate_user_session[password]': password,
'commit': 'Log In to Portal',
},
{
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
}
}
);
密钥、用户名和密码相同。
那么这个语法错误是什么?
当我从邮递员发送此请求时,我遇到了同样的错误。
Axios 和 Guzzle 似乎以不同的方式处理
application/x-www-form-urlencoded
数据。
在 PHP with Guzzle 中,form_params 选项会自动转换 数据转换为查询字符串格式,这是服务器所期望的 当 Content-Type 为 application/x-www-form-urlencoded 时。
在 Axios 中,您将数据作为 JSON 对象发送,这不是 正确编码。您需要将数据编码为 使用 Axios 时的查询字符串格式。
您可以使用 URLSearchParams API 来实现此目的,尝试如下操作:
const params = new URLSearchParams();
params.append('authenticity_token', authKey);
params.append('affiliate_user_session[login]', name);
params.append('affiliate_user_session[password]', password);
params.append('commit', 'Log In to Portal');
const postResponse = await axios.post(
url,
params.toString(),
{
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
}
}
);