通过cURL POST PHP传递JSON

I've been trying to pass JSON though my web application using cURL - and I am a little stuck now.

Here is what I've tried :

Step 1:

I tried to post JSON using this

<?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);

  }

?>

Step 2:

I tried to receive JSON back using this

public function get(){

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

    }

Result: - I keep getting null when I do dd($json);

Can someone please help me point out what did I do wrong ?


Detail :

  • I use PHP Framework : Laravel 4.0
  • I am positive that URL parameter is correct because I can go to it
  • I am also sure that the JSON is not broken because after added print("<h1> JSON </h1><pre>".print_r($json,true)."</pre><br><hr><br>"); I can see my JSON display fine.

  • See Image

dongwuying0221
dongwuying0221 让我们在聊天中继续讨论。
5 年多之前 回复
douhandie6615
douhandie6615 因此,函数post()向你的api发出一个POST请求,并在一个名为$response的变量中获得答案(不在任何地方使用)。然后你有一个单独的函数get()输出一个GET参数。两者如何相互关联?
5 年多之前 回复
douwei1950
douwei1950 URL参数是正确的+JSON没有被破坏-你的终点是什么意思?
5 年多之前 回复
doupu1957
doupu1957 这里有几件事可能会出错...响应可能是空的(或者包含一个损坏的json文件),url可能是错误的(或包含错误的参数),终点可能会被破坏...甚至不知道从哪儿开始。我们需要更多细节。
5 年多之前 回复
drl57959
drl57959 :如果我错了,请纠正我,我是这个cURL世界的新手。我希望你不介意给我更详细的建议。
5 年多之前 回复
douseda0009
douseda0009 :我使用PHPFramework:Laravel4.0
5 年多之前 回复
dounaoji2054
dounaoji2054 我们应该猜测服务器端的内容吗?
5 年多之前 回复
duanbu1998
duanbu1998 你在使用框架吗?如果是,请将标记添加到问题中。如果没有,$_POST['json']而不是Input::get('json')有什么问题?
5 年多之前 回复

3个回答



就调试工作而言,您应该转储响应</ em>而不是 json_decode </ code >(s)尝试解析它。</ p>

因此更改此</ p>

 公共函数get(){
$ json = json_decode( Input :: get('json'));
dd($ json); // null
}
</ code> </ pre>

到此</ p>

 公共函数get(){
dd(输入 :: get('json'));
}
</ code> </ pre>

这应该更好地帮助您追踪真正的问题,这很可能是服务器不是' 用有效的JSON响应。</ p>

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

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

//如果响应是可解析的,返回它
if($ json!== null)
return $ json;

// 确定响应是否为有效的null或
//为什么它是不可解析的
switch(json_last_error()){
//服务器可以使用有效的null响应,
//所以继续并返回它。

case JSON_ERROR_NONE:
返回$ json;
case JSON_ERROR_DEPTH:
echo' - 超出最大堆栈深度';
break;
case JSON_ERROR_STATE_MISMATCH:
echo' - 下溢或模式不匹配';
break;
case JSON_ERROR_CTRL_CHAR:
echo' - 找到意外的控制字符';
break;
case JSON_ERROR_SYNTAX:
echo' - 语法错误,格式错误的JSON';
break;
case JSON_ERROR_UTF8:
echo' - 格式错误的UTF-8字符,可能编码错误';
break;
default:
echo' - 未知错误 ';
break;
}
}
</ code> </ pre>
</ div>

展开原文

原文

As far as your debugging efforts, you should dump the response rather than json_decode(s) attempt to parse it.

So change this

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

to this

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

That should better help you track down the real problem, which most likely is that the server isn't responding with valid JSON.

Another option is to use json_last_error to see why the response was unparseable.

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;
        }
}

doutuo2829
doutuo2829 感谢:D。 你救我。
5 年多之前 回复
dragon201401
dragon201401 天啊,我看到了问题......我会给你一个新的答案,秒。
5 年多之前 回复
douqianzha6213
douqianzha6213 当我尝试你的其他建议时,我什么也没得到。 看来我的post函数没有通过cURL传递JSON。 我需要在post()函数结束时返回任何内容吗?
5 年多之前 回复
douliao8402
douliao8402 你去...你没有从服务中获得有效的JSON!
5 年多之前 回复
dourao3960
dourao3960 当我做dd(Input :: get('json')); 当我转到URL时,我得到了null
5 年多之前 回复



看起来你没有返回cURL调用的结果。</ p>

   public function post()
{
//原始函数的第一部分很好......

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

/ n / /但你需要返回响应!
返回$ response;
}
</ code> </ pre>
</ div>

展开原文

原文

Looks like you aren't returning the results of the cURL call.

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;
}

donglun2024
donglun2024 好的,那么你可能需要调试cURL响应。 查看响应标头和响应代码,看看是否有来自服务器的信息。 首先随机猜测,你确定'json'是传递它们的正确参数吗? 也许他们期待在帖子体中使用JSON。 (只是一个想法)。
5 年多之前 回复
dongyinzheng6572
dongyinzheng6572 DD(输入::得到( 'JSON')); 保持return null,所以我的post()函数根本没有发布任何东西
5 年多之前 回复
dpict99695329
dpict99695329 我把它们放在一起,当我回应$ json时; 在我的get()函数中 - 我什么都没有,空白,__________
5 年多之前 回复
duanchi6377
duanchi6377 把它和我的其他答案放在一起,看看它能带给你什么。
5 年多之前 回复
duanhuoyao7011
duanhuoyao7011 谢谢。 当我$ json = json_decode(Input :: get('json'))时,我做到了并且仍然没有得到任何结果。 echo $ json;,但我们很接近!!
5 年多之前 回复



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

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

话虽如此,您的json应该出现在 $ response </ code>变量。 你可以输出。 但这不是调试api请求的最佳方法。</ p>

更简单的方法是删除dd()并写入日志文件。</ p>
</ div >

展开原文

原文

You can't print stuff on the server side if your client is a script (ie: not the browser).

Everything you print on the server side will be returned to the client (the post() script).

That being said, your json should be present in the $response variable. You can output that. But it's not the best way to debug the api requests.

The easier way would be remove the dd() and write to a log file instead.

doujie4787
doujie4787 谢谢你的提示,我会记住这一点。
5 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐