Node js无法通过php从curl请求读取数据
我在读取nodejs中通过curl请求发送的数据时遇到问题。对于Postman,一切都正常工作,但当我尝试通过curl发送请求时,api返回500个内部服务器错误,我不知道错误在哪里 这是我的php代码Node js无法通过php从curl请求读取数据,php,node.js,curl,Php,Node.js,Curl,我在读取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) {
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应用程序[web.1]:TypeError:无法读取未定义的属性“length”。
我不知道我的错误在哪里,为什么我不能读取节点js上的json数据,任何帮助都会很有用。在php/curl中,您似乎没有正确地将主体添加到请求中。因此,
req.body.content
是未定义的
。访问undefined
上的属性会抛出错误,因此您需要在JS代码中检查这种可能性,但系统中的真正问题是您没有用php发送正文。希望这能帮助您找到问题的根源,并且您可以从中找出如何将正文数据附加到请求。您的代码有两个明显的错误,并且由于PHP糟糕的libcurl包装器,PHP在发现时甚至不会警告您
CURLOPT_HEADER决定curl是否应该在输出中打印接收到的头和正文,它甚至不接受数组,它接受bools(true/false/0/1),如果api设计良好,当给CURLOPT_头指定除bool以外的任何内容时,您将得到一个InvalidArgumentException
或TypeError
。。但是因为它设计得不好,php只是。。。“将数组转换为布尔值”(表示如果数组为空,则为false
,否则为true
)
这里实际需要的是CURLOPT_HTTPHEADER
,用于设置HTTP请求头的选项,使用数组
此外,
'Content-Length: ' . mb_strlen(json_encode($post))
这是错误的,首先mb_strlen()提供字符串中unicode字符的数量,而
内容长度
头应该包含字节数,而不是unicode字符数,因此它应该是strlen(),而不是mb_strlen()-其次,如果不添加,curl将自动添加此头,而且curl不会出现任何打字错误,也不会计算错误的长度,因此您最好让curl自动添加此标题(您计算的长度错误,curl不会出错,而且人类也容易引入打字错误,curl有测试套件来确保“内容长度”中没有打字错误)header,相比之下,我打赌您的项目没有testsuites来确保您没有在内容长度header中引入任何打字错误)是的,在postman中,我使用原始json内容发送到请求,好的,我将尝试通过body发送信息,而不是作为原始json对象不,请求body实际上很好,问题在于,请求头是古怪的(例如,他的请求的“内容类型”表示application/x-www-form-urlencoded
,这会将fsck与NodeJS混淆)
'Content-Length: ' . mb_strlen(json_encode($post))