http请求从php到node的转换

问题描述 投票:0回答:1

我正在将旧版 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',
                    }
                }
            );


密钥、用户名和密码相同。

那么这个语法错误是什么?

当我从邮递员发送此请求时,我遇到了同样的错误。

php node.js https axios guzzle
1个回答
0
投票

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',
        }
    }
);
© www.soinside.com 2019 - 2024. All rights reserved.