通过 cURL POST PHP 传递 JSON

Posted

技术标签:

【中文标题】通过 cURL POST PHP 传递 JSON【英文标题】:Passing JSON through cURL POST PHP 【发布时间】:2015-04-02 18:09:42 【问题描述】:

我一直在尝试使用 cURL 通过我的 Web 应用程序传递 JSON - 我现在有点卡住了。

这是我尝试过的:

第 1 步:

我尝试使用这个发布 JSON

<?php 

  public function post()

    $cars = array("Volvo", "BMW", "Toyota");
    $json = json_encode($cars);

    $ch = curl_init("http://localhost/api_v2/url?key=***");

    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, array('json' => $json));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    $response = curl_exec($ch);
    curl_close($ch);

  

?>

第 2 步:

我尝试使用此方法接收 JSON

public function get()

        $json = json_decode(Input::get('json'));
        dd($json); // null

    

结果: - 当我做dd($json);时,我总是得到null

有人可以帮我指出我做错了什么吗?


详情:

我使用 PHP 框架:Laravel 4.0 我确信 URL 参数是正确的,因为我可以访问它

我也确信 JSON 没有损坏,因为添加 print("&lt;h1&gt; JSON &lt;/h1&gt;&lt;pre&gt;".print_r($json,true)."&lt;/pre&gt;&lt;br&gt;&lt;hr&gt;&lt;br&gt;"); 后我可以看到我的 JSON 显示正常。

见Image

【问题讨论】:

你在使用框架吗?如果是这样,请将标签添加到问题中。如果不是,那么 $_POST['json'] 而不是 Input::get('json') 有什么问题? 我们是否应该猜测服务器端的内容? @TommyBs:我使用 PHP 框架:Laravel 4.0 @EdsonMedina :如果我错了,请纠正我,我是这个 cURL 世界的新手。我希望你不介意帮我提供更详细的建议。 这里有几件事可能出错...响应可能为空(或包含损坏的 json 文件),url 可能错误(或包含错误的参数),端点可能被损坏... 甚至不知道从哪里开始。我们需要更多细节。 【参考方案1】:

就您的调试工作而言,您应该转储响应,而不是json_decode(s) 尝试解析它。

所以改变这个

public function get() 
    $json = json_decode(Input::get('json'));
    dd($json); // null

到这里

public function get() 
    dd(Input::get('json'));

这应该可以更好地帮助您找出真正的问题,这很可能是服务器没有使用有效的 JSON 响应。

另一种选择是使用json_last_error 查看响应无法解析的原因。

public function get() 
    $json = json_decode(Input::get('json'));

    // If the response was parseable, return it
    if($json !== null)
        return $json;

    // Determine if the response was a valid null or
    // why it was unparseable
    switch (json_last_error()) 
        // The server could respond with a valid null,
        // so go ahead and return it.
        case JSON_ERROR_NONE:
            return $json;
        case JSON_ERROR_DEPTH:
            echo ' - Maximum stack depth exceeded';
            break;
        case JSON_ERROR_STATE_MISMATCH:
            echo ' - Underflow or the modes mismatch';
            break;
        case JSON_ERROR_CTRL_CHAR:
            echo ' - Unexpected control character found';
            break;
        case JSON_ERROR_SYNTAX:
            echo ' - Syntax error, malformed JSON';
            break;
        case JSON_ERROR_UTF8:
            echo ' - Malformed UTF-8 characters, possibly incorrectly encoded';
            break;
        default:
            echo ' - Unknown error';
            break;
        

【讨论】:

当我执行dd(Input::get('json')); 时,当我转到 URL 时,我得到了null 你去......你没有从服务中得到有效的 JSON! 当我尝试你的其他建议时,我什么也没得到。似乎我的 post 函数没有通过 cURL 传递 JSON。我需要在 post() 函数结束时返回任何内容吗? 天啊,我看到了问题......我会提出一个新的答案,秒。 谢谢:D。你救了我。【参考方案2】:

您似乎没有返回 cURL 调用的结果。

public function post()

   // The first part of your original function is fine...

   $response = curl_exec($ch);
   curl_close($ch);

   // But you need to return the response!
   return $response;

【讨论】:

谢谢。我这样做了,但当我 ` $json = json_decode(Input::get('json')); echo $json;`,但我们很接近了! 把这个和我的其他答案放在一起,看看你会得到什么。 我确实将它们放在一起,当我在 get() 函数中 echo $json; 时 - 我什么也没得到,空白,__________ dd(Input::get('json')); keep return null 所以我的 post() 函数根本没有发布任何内容 好的,那么您可能需要调试 cURL 响应。查看响应标头和响应代码,看看是否有来自服务器的信息。第一次随机猜测,你确定 'json' 是传递它们的正确参数吗?也许他们希望在帖子正文中使用 JSON。 (只是一个想法)。【参考方案3】:

如果您的客户端是脚本(即:不是浏览器),则无法在服务器端打印内容。

您在服务器端打印的所有内容都将返回给客户端(post() 脚本)。

话虽如此,您的 json 应该存在于 $response 变量中。你可以输出那个。但这并不是调试 api 请求的最佳方式。

更简单的方法是删除 dd() 并改为写入日志文件。

【讨论】:

以上是关于通过 cURL POST PHP 传递 JSON的主要内容,如果未能解决你的问题,请参考以下文章

Curl和PHP - 如何通过PUT,POST,GET将json传递给curl

php用curl的post方法传递json包的时候,接受方是怎么获取的呢

php curl get 参数

php post 设置header json传参

Php 通过curl提交post内容为 Json的请求

关于PHP中POST传递参数问题