【问题标题】:Curl request working in terminal but not in php卷曲请求在终端中工作但不在 php 中
【发布时间】:2017-06-16 04:11:17
【问题描述】:

尝试在 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>

更新:通过 php 请求发送的数据

$data = json_encode( [
    "title"     => "Hello World",
    "message"   => $message,
    "installIds" => [ $deviceToken, ],
] );

更新:预期输出(在命令行 curl 中收到)

{  
"appId":9999,
"source":2,
"status":1,
"filters":{  
    "installIds":[  
        "xxx"
    ]
},
"title":"Test",
"message":"3 new questions on Tomorrow Times!",
"data":null,
"isBackgroundData":false,
"url":null,
"targetedRecipients":0,
"expectedResolutionSteps":0,
"completedResolutionSteps":0,
"expectedBatches":0,
"completedBatches":0,
"updatedAt":"2017-06-16T04:58:54+0000",
"createdAt":"2017-06-16T04:58:54+0000",
"id":13976
}

【问题讨论】:

    标签: php curl php-curl


    【解决方案1】:

    您需要设置curlopt_followlocation =&gt; 1。您还期望返回什么?如果您希望除真实虚假值之外的其他内容,则需要删除 curlopt_returntransfer。另外,如果您要发送帖子,请使用CURLOPT_POST =&gt; 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_RETURNTRANSFER

    CURLOPT_RETURNTRANSFER

    TRUE 将传输作为 curl_exec() 的返回值的字符串返回,而不是直接输出。


    CURLOPT_FOLLOWLOCATION

    TRUE 后跟服务器作为 HTTP 标头的一部分发送的任何“Location:”标头(注意这是递归的,PHP 将跟随着它发送的尽可能多的“Location:”标头,除非设置了 CURLOPT_MAXREDIRS)。


    编辑

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

    从我们的对话中可以看出,在实施更改后,您现在收到的是 200 而不是 3XX。请相应地更新问题。我认为现在问题出在您的数据中

    【讨论】:

    • 谢谢 :) 它返回 JSON,其中包含有关所执行操作的详细信息... ATM 它返回一些 HTML...
    • 更新的问题与响应 php curl 请求返回... 将 CURLOPT_FOLLOWLOCATION 设置为 false 对我没有用...
    • 您确定这是一个 post 请求而不是 put 请求吗?您需要发送 API 密钥吗?您可以发布您发送的 JSON 数据吗?
    • 更新问题 :) 你能分享你所指的文档的链接吗?
    • 是的,使用POST ;)
    【解决方案2】:

    这里是来自 Kumulos 技术支持的标记。

    问题是由于请求中没有 HTTP 标头造成的。

    CURLOPT_HEADER 用于(truefalse)指示是否将标头包含在请求中。

    要实际设置标题,您需要使用CURLOPT_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;
    }
    ?>
    

    【讨论】:

    • 非常感谢马克!!!我知道我一定缺少像这样的基本东西,但无法弄清楚是什么......?再次感谢!祝你愉快! ?
    猜你喜欢
    • 1970-01-01
    • 2017-08-23
    • 1970-01-01
    • 2015-07-08
    • 2022-01-07
    • 2011-04-23
    • 2014-08-21
    • 2021-02-24
    • 1970-01-01
    相关资源
    最近更新 更多