【问题标题】:How to set the request body in a json format如何将请求正文设置为json格式
【发布时间】:2016-10-04 12:24:14
【问题描述】:

我正在尝试将 json 格式的请求正文发送到 API。文档声明正文需要像这样格式化:

//Request body needs to the contain a JSON object in the following format:

{  
  "delete_list":[  
    "8fcd1d68c82dd39d65ef8ea9a7948bbe",
    "8bca1d68c92dd39d65ef8ea9a7948bbe",
    "8bca1d69c82d939d65ef8ea9a7948bbe",
    "8bca1d69c82d939d65ef8ea9a7947bbe"
   ]
}

我尝试的代码似乎失败了,我不知道为什么。我已经尝试了很多调整,但似乎没有任何效果:

    $del = array("delete_list" => "[8bca1d69c82d939d65ef8ea9a7947bbe]");
    $j = json_encode($del);


    $apiToken = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';

    $httpHeadersArray = Array();
    $httpHeadersArray[] = 'Authorization: key='.$apiToken;
    $httpHeadersArray[] = 'Content-Type: application/json';


    //open connection
    $ch = curl_init();

    //set the url, number of POST vars, POST data
    curl_setopt($ch, CURLOPT_URL, $curlUrl);
    #curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($j));
    curl_setopt($ch, CURLOPT_HTTPHEADER, $httpHeadersArray);


    $res = curl_exec($ch);


    echo "<pre>";
    print_r($res);
    echo "</pre>";

我从 API 返回的最终结果如下:

{"status":"failure","message":"JSON malformed"}

关于我在代码中做错了什么有什么建议吗?这将不胜感激。谢谢!

【问题讨论】:

  • 尝试摆脱 http_build_query,因为它会编码重要的 JSON 位
  • $del = array("delete_list" =&gt; "[8bca1d69c82d939d65ef8ea9a7947bbe]"); 需要类似于:- $del = array("delete_list" =&gt; array("8bca1d69c82d939d65ef8ea9a7947bbe"));

标签: php json api


【解决方案1】:

两件事:

1) 您正在使用单个字符串对对象进行 json 编码,但您需要使用数组对对象进行编码。

2) 您正在使用http_build_query,它将对数组参数进行urlencode 并破坏JSON 结构。

这样做:

    $del = array("delete_list" => [ "8bca1d69c82d939d65ef8ea9a7947bbe" ]);
    $j = json_encode($del);


    $apiToken = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';

    $httpHeadersArray = Array();
    $httpHeadersArray[] = 'Authorization: key='.$apiToken;
    $httpHeadersArray[] = 'Content-Type: application/json';


    //open connection
    $ch = curl_init();

    //set the url, number of POST vars, POST data
    curl_setopt($ch, CURLOPT_URL, $curlUrl);
    #curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
    curl_setopt($ch, CURLOPT_POSTFIELDS, $j);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $httpHeadersArray);


    $res = curl_exec($ch);


    echo "<pre>";
    print_r($res);
    echo "</pre>";

【讨论】:

  • 你完全正确!这就是正在发生的事情。当您用两个脚踝骨折和非常好的止痛药进行编码时,就会发生这种情况!谢谢@apokryfos
【解决方案2】:

将标题放在顶部

header('Content-Type: application/json');

【讨论】:

  • 设置header根本不会影响cURL请求。
  • 哥们,他输出的结果,肯定会受到影响,CURL无所谓。
【解决方案3】:

是的,您的 json 格式或数组格式不正确

$del = array("delete_list" => array("8bca1d69c82d939d65ef8ea9a7947bbe")); $j = json_encode($del);

这是正确的方法,您将数组作为字符串传递,这是行不通的。

【讨论】:

    【解决方案4】:

    json_encode() 返回一个包含值的 JSON 表示形式的字符串。

    ——PHP Manual

    它返回一个值的表示。

    print_r(array(
        "delete_list" => "[8bca1d69c82d939d65ef8ea9a7947bbe]"
    ));
    

    打印:

    {
        "delete_list": "[8bca1d69c82d939d65ef8ea9a7947bbe]"
    }
    

    鉴于:

    print_r(array(
        "delete_list" => array(
            "8bca1d69c82d939d65ef8ea9a7947bbe"
        )
    ));
    

    打印:

    {
        "delete_list": [
            "8bca1d69c82d939d65ef8ea9a7947bbe"
        ]
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-16
      • 2020-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-03
      • 1970-01-01
      • 2018-09-19
      相关资源
      最近更新 更多