Curl请求在终端中工作,但在php中不工作

Curl请求在终端中工作,但在php中不工作,php,curl,php-curl,Php,Curl,Php Curl,试图在php中实现这一点 curl -X POST -H "Content-Type: application/json" -H "Accept: application/json" -u xxx:xxx -d '{ "broadcast": true, "title": "Hello World", "message": "from Kumulos Push" }' "https://push.kumulos.com/notifications" 在php中我有这个

试图在php中实现这一点

curl -X POST
-H "Content-Type: application/json"
-H "Accept: application/json"
-u xxx:xxx
-d '{
    "broadcast": true,
    "title": "Hello World",
    "message": "from Kumulos Push"
}' "https://push.kumulos.com/notifications"
在php中我有这个

$ch = curl_init( 'https://push.kumulos.com/notifications' );

curl_setopt_array( $ch, [
    CURLOPT_CUSTOMREQUEST  => 'POST',
    CURLOPT_HEADER         => [
        'Content-Type: application/json',
        'Accept: application/json',
        'Content-Length: ' . strlen( $data ),
    ],
    CURLOPT_USERPWD        => 'xxx:xxx',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POSTFIELDS     => $data,
] );

$resp = htmlentities( curl_exec( $ch ) );
仍然在php中,我得到了重定向,而在命令行中,我得到了预期的响应

更新 它在PHP中返回这个HTML,而在命令行中我得到了预期的JSON

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8" />
        <meta http-equiv="refresh" content="1;url=https://push.kumulos.com" />

        <title>Redirecting to https://push.kumulos.com</title>
    </head>
    <body>
        Redirecting to <a href="https://push.kumulos.com">https://push.kumulos.com</a>.
    </body>
</html>
更新:预期输出(在命令行curl中接收)
您需要设置
curlopt\u followlocation=>1
。还有,你希望返回什么?如果期望的不是真实值,则需要删除
curlopt\u returntransfer
。此外,如果您正在发送帖子,只需使用
CURLOPT_post=>1


示例

$ch = curl_init( 'https://push.kumulos.com/notifications' );

curl_setopt_array( $ch, [
    CURLOPT_POST => 1,
    CURLOPT_HEADER         => [
        'Content-Type: application/json',
        'Accept: application/json',
        'Content-Length: ' . strlen( $data ),
    ],
    CURLOPT_USERPWD        => 'xxx:xxx',
    CURLOPT_FOLLOWLOCATION => 1,
    CURLOPT_POSTFIELDS     => $data,
] );

$resp = htmlentities( curl_exec( $ch ) );
因为你正在使用

htmlentities(...)
我肯定认为您需要删除CURLOPT\u RETURNTRANSFER

卷发转移 如果为TRUE,则将传输作为curl_exec()返回值的字符串返回,而不是直接输出


卷曲跟随定位 如果在服务器作为HTTP头的一部分发送的任何“Location:”头之后加上TRUE(注意,这是递归的,PHP将在发送的相同数量的“Location:”头之后加上,除非设置了CURLOPT_MAXREDIRS)


编辑
处理来自用户的新信息。请参阅Kumulos文档。您确定这是post请求而不是put请求吗?您需要发送API密钥吗?你能发布你正在发送的JSON数据吗


从我们的对话中可以看出,在实施更改后,您现在收到的是200而不是3XX。请相应地更新问题。现在的问题就在您的数据中,我相信这里是Kumulos技术支持的Mark

该问题是由请求中缺少HTTP头引起的

CURLOPT_HEADER
用于(
true
false
)指示请求中是否包含头

要实际设置标题,需要使用
CURLOPT\u HTTPHEADER

如果没有标头,请求将被重定向,如您所见

请在下面找到一些PHP代码示例,使用Kumulos push API向所有订阅的应用程序安装发送广播推送

#!/usr/bin/php
<?php
$postData = json_encode( array (
    "broadcast" => true,
    "title" => "Test Broadcast",
    "message" => "Test from PHP" )
);

$curl = curl_init();

curl_setopt_array( $curl, [
    CURLOPT_URL            => "https://push.kumulos.com/notifications",
    CURLOPT_HTTPHEADER     => array (
            'content-type: application/json',
            'accept: application/json',
            'content-length: ' . strlen($postData),
        ),
    CURLOPT_USERPWD        => 'apiKey:serverKey',
    CURLOPT_CUSTOMREQUEST  => "POST",
    CURLOPT_POSTFIELDS     => $postData,
    CURLOPT_RETURNTRANSFER => true
] );

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}
?>
#/usr/bin/php

Thank:)它返回JSON,其中包含所执行操作的详细信息。。。ATM返回一些HTML…更新的问题和响应php curl请求返回。。。将
CURLOPT\u FOLLOWLOCATION
设置为false对我来说没有效果……你确定这是一个post请求而不是put请求吗?您需要发送API密钥吗?你能发布你正在发送的JSON数据吗?更新的问题:)你能共享你正在引用的文档的链接吗?是的,使用
post
;)谢谢你,马克!!!我知道我一定是错过了一些基本的东西,像这样,但无法找出什么。。。
htmlentities(...)
#!/usr/bin/php
<?php
$postData = json_encode( array (
    "broadcast" => true,
    "title" => "Test Broadcast",
    "message" => "Test from PHP" )
);

$curl = curl_init();

curl_setopt_array( $curl, [
    CURLOPT_URL            => "https://push.kumulos.com/notifications",
    CURLOPT_HTTPHEADER     => array (
            'content-type: application/json',
            'accept: application/json',
            'content-length: ' . strlen($postData),
        ),
    CURLOPT_USERPWD        => 'apiKey:serverKey',
    CURLOPT_CUSTOMREQUEST  => "POST",
    CURLOPT_POSTFIELDS     => $postData,
    CURLOPT_RETURNTRANSFER => true
] );

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}
?>