【问题标题】:Node js can not read the data from curl request via phpNode js无法通过php从curl请求中读取数据
【发布时间】:2020-08-18 07:35:22
【问题描述】:

我在 nodejs 中读取通过 curl 请求发送的数据时遇到问题。使用 Postman 一切正常,但是当我尝试通过 curl 发送请求时,api 返回 500 内部服务器错误,我不知道错误在哪里。

这是我的php代码

private function curl($url, $post = false, $header = false)
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    if ($post) {
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($post));
    }
    curl_setopt($ch, CURLOPT_HEADER, [
        'Content-Type: application/json',
        'Accept: application/json',
        'Content-Length: ' . mb_strlen(json_encode($post))
    ]);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $response = curl_exec ($ch);
    curl_close($ch);
    return $response;
}

那么现在就跟大家分享一下nodejs的部分

console.log(req.body)
    let content = req.body.content
    if (!content.length) {
        return res.status(401).send({message: 'content is required'})
    }

这是日志信息

{ '{"content":"content information"}': '' }

2020-08-18T07:27:38.191100+00:00 app[web.1]:TypeError:无法读取未定义的属性“长度”。 我不知道我的错误在哪里,以及为什么我无法读取节点 js 上的 json 数据,任何帮助都会得到帮助。

【问题讨论】:

    标签: php node.js curl


    【解决方案1】:

    您的代码有 2 个值得注意的错误,并且由于 PHP 糟糕的 libcurl 包装器,php 在发现时甚至不会警告您,

    curl_setopt($ch, CURLOPT_HEADER, [
    

    CURLOPT_HEADER 决定 curl 是否应该在输出中打印接收到的标头以及正文,它甚至不接受数组,它接受布尔值 (true/false/0/1),如果 api 设计良好, 你会得到一个InvalidArgumentExceptionTypeError 当给 CURLOPT_HEADER 任何东西而不是布尔值.. 但因为它设计得不好, php 只是......“将数组转换为布尔值”(意味着它将是 false如果数组为空,否则true

    你真正想要的是 CURLOPT_HTTPHEADER ,用于设置 HTTP 请求标头的选项,采用数组。

    此外,

        'Content-Length: ' . mb_strlen(json_encode($post))
    

    这是错误的,首先 mb_strlen() 给出了字符串中 unicode 字符的数量,而 Content-Length 标头应该包含 字节数,而不是 unicode 的数量字符,所以它应该是 strlen(),而不是 mb_strlen() - 其次,如果你不添加,curl 会自动添加这个 header,curl 不会打错字,也不会计算长度错误,所以你最好还是让 curl 自动添加这个标题(你计算的长度错误,curl 不会犯那个错误,人类也容易引入错别字,curl 有测试套件来确保“内容”中没有错别字-Length" 标头,相比之下,我敢打赌您的项目没有测试套件,以确保您没有在 Content-Length 标头中引入任何拼写错误)

    【讨论】:

      【解决方案2】:

      您似乎没有正确地将正文添加到 php/curl 中的请求中。因此,req.body.contentundefined。访问undefined 上的属性会引发错误,因此您需要在 JS 代码中检查这种可能性,但系统中的真正问题是您没有在 php.ini 中发送正文。希望这可以帮助您找到问题的根源,并且您可以从那里弄清楚如何将正文数据附加到您的请求中。

      【讨论】:

      • 是的,在邮递员中我使用原始 json 内容发送到请求,好的,我将尝试通过正文而不是原始 json 对象发送信息
      • 不,请求正文实际上很好,问题是请求标头很奇怪(例如,他的请求的“Content-Type”显示application/x-www-form-urlencoded,这会使 fsck 与 NodeJS 混淆)
      【解决方案3】:

      我在尝试这样做时遇到了同样的问题。这可以通过使用http_build_query($post) 而不是json_encode 来解决。 如果您使用的是 express JS,请确保您有以下处理程序。

      app.use(express.urlencoded({ extended: false }));
      app.use(express.json());
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-26
        • 2016-05-14
        • 1970-01-01
        • 2020-04-22
        • 1970-01-01
        • 2021-07-20
        • 1970-01-01
        • 2017-11-21
        相关资源
        最近更新 更多