Graent.Hu 的博客

新浪微薄腾讯微薄

最新碎语:最近感觉有些迷茫,怎么办~

您的位置:Graent.Hu 的博客 >PHP编程> curl 返回http头信息处理;curl返回header头和body处理

curl 返回http头信息处理;curl返回header头和body处理

src=http___img.alicdn.com_imgextra_i2_514500407_TB2NjPajVXXXXbUXpXXXXXXXXXX_!!514500407.jpg_620x10000.jpg&refer=http___img.alicdn.jpg

今天做一个短信发送的功能,用的是阿里云云市场的一个第三方的发送api按照服务商的说法返回的数据是json的,那是很简单了,也没几个参数,服务商给出的php实例代码是适应curl实现请求的,如下:


<?php
    $host = "https:/*******m";
    $path = "/msg";
    $method = "POST";
    $appcode = "你自己的AppCode";
    $headers = array();
    array_push($headers, "Authorization:APPCODE " . $appcode);
    //根据API的要求,定义相对应的Content-Type
    array_push($headers, "Content-Type".":"."application/x-www-form-urlencoded; charset=UTF-8");
    $querys = "";
    $bodys = "message=%E6%82%A8%E7%9A%84%E9%AA%8C%E8%AF%81%E7%A0%81%E6%98%AF123456%E3%80%82%E5%A6%82%E9%9D%9E%E6%9C%AC%E4%BA%BA%E6%93%8D%E4%BD%9C%EF%BC%8C%E8%AF%B7%E5%BF%BD%E7%95%A5%E6%9C%AC%E7%9F%AD%E4%BF%A1&mobile=mobile&mouldno=44CAD037&title=%E4%BA%91%7%0%%9A";
    $url = $host . $path;

    $curl = curl_init();
    curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($curl, CURLOPT_FAILONERROR, false);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_HEADER, true);
    if (1 == strpos("$".$host, "https://"))
    {
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
    }
    curl_setopt($curl, CURLOPT_POSTFIELDS, $bodys);
    var_dump(curl_exec($curl));
?>
好简单的几句话,一想也别测试了直接集成算了,代码就用示例简单,然后就return了,结果怎么都无法获取到服务商所说的json数据:



{
  "errcode": "00000",
  "jobid": "20201121160310594112031",
  "responsetime": "20201121160310654",
  "errmsg": "提交成功"
}
好家伙,打印了一下发现返回的是一串字符串(json也是字符串形式返回),但是他返回的信息里面包含了header,



HTTP/1.1 200 OK\r\nDate: Tue, 04 May 2021 16:58:57 GMT\r\nContent-Type: application/json;charset=utf-8\r\nTransfer-Encoding: chunked\r\nConnection: keep-alive\r\nKeep-Alive: timeout=25\r\nVary: Accept-Encoding\r\nVary: Accept-Encoding\r\nServer: Kaede/3.5.3.535 (sz001r8iy)\r\nX-Ca-Request-Id: 9574345A-012F-465F-9291-BF44373B7559\r\n\r\n{\"errcode\":\"00000\",\"jobid\":\"20210505005857176841325\",\"responsetime\":\"20210505005857398\",\"errmsg\":\"提交成功\"}


你想这样也不是严格的json了,必定多出来一部分,所以没办法,就想着处理处理,把数据分离一下吧

搜索了一下使用用curl自带的curl_getinfo()方法获取头的长度,然后使用substr来分割字符串:


$r = curl_exec($curl);

        if (curl_getinfo($curl, CURLINFO_HTTP_CODE) == '200') {
            $headerSize = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
            $header = substr($r, 0, $headerSize);
            $body = substr($r, $headerSize);
        }

这样的话在打印body还有header就分开了,body获取到了json字符串,然后在进行json_decode就可以得到想要的数据了,好多坑,希望对你有帮助

我的微信:graent_hu

欢迎扫码加我的微信好友,有什么问题我们可以一起探讨,有什么需要也随时欢迎发消息给我~

转载请注明出处:

本文标题:curl 返回http头信息处理;curl返回header头和body处理

本文链接:https://www.wlyc.cn/post-206.html

发表评论

路人甲 表情
看不清楚?点图切换