zoukankan      html  css  js  c++  java
  • PHP扩展curl

    一、CURL通过post发送JSON并接收JSON

    CURL请求代码:

    1. //要发送的数据
    2. $data = (
    3. 'name' => '张三',
    4. 'age' => '32'
    5. );
    6. $header = array(
    7. 'Content-Type: application/json; charset=utf-8',
    8. 'Content-Length:' . strlen($data))
    9. );
    10. $url = https://www.xxx.com/xxx/xxx/xxx.php
    11. //调用方法,请求数据
    12. $rst = tocurl($url,$header,json_encode($data,JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT));
    13. echo $rst;
    14. /**
    15. * CURL 方法
    16. * @param String $url 请求的地址
    17. * @param Array $header 自定义的header数据(请求头)
    18. * @param Array $data POST的数据
    19. * @return String
    20. */
    21. function tocurl($url, $header, $data){
    22. $ch = curl_init();
    23. if(substr($url,0,5)=='https'){
    24. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查
    25. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, true); // 从证书中检查SSL加密算法是否存在
    26. }
    27. curl_setopt($ch, CURLINFO_HEADER_OUT, TRUE);
    28. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    29. curl_setopt($ch, CURLOPT_URL, $url);
    30. curl_setopt($ch, CURLOPT_HEADER, 1);
    31. curl_setopt($ch, CURLOPT_NOBODY, FALSE);
    32. curl_setopt($ch, CURLOPT_HTTPHEADER,$header);
    33. curl_setopt($ch, CURLOPT_POST, true);
    34. curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    35. $response = curl_exec($ch);
    36. if($error=curl_error($ch)){
    37. die($error);
    38. }
    39. //通过curl_getinfo()可以得到请求头的状态
    40. $http_status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    41. //这里可以看到结果中header和body信息是在一起的,那么如何分离它们呢。方法有二种,一是通过curl自带的curl_getinfo()方法获取头的长度,然后使用substr来分割字符串。示例代码如下:
    42. // 把body 和 header 分离
    43. if (curl_getinfo($ch, CURLINFO_HTTP_CODE) == '200') {
    44. $headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
    45. $header = substr($response, 0, $headerSize);
    46. $body = substr($response, $headerSize);
    47. }
    48. //二选一即可。
    49. //第二种方法基于header和body是通过两个回车换行来分割的,所以可以通过如下代码实现:
    50. //$response = curl_exec($ch);
    51. //if (curl_getinfo($ch, CURLINFO_HTTP_CODE) == '200') {
    52. // list($header, $body) = explode(" ", response, 2);
    53. //}
    54. curl_close($ch);
    55. return $response;
    56. }

    服务器端获取post数据代码:

    1. //我们通过下面这种方式获取数据,最后获取到的数据是空值。
    2. var_dump($_POST);
    3. //上网搜索了一下发现PHP默认只识别application/x-www.form-urlencoded标准的数据类型,修改头信息也没有结果…只能通过以下方式获得数据
    4. //这两种方式都可以获取到数据(二选一即可)
    5. $post = $GLOBALS['HTTP_RAW_POST_DATA'];
    6. $post2 = file_get_contents("php://input");

    二、CURL 请求头和响应头

    1.从CURL中获取响应头

    1. $oCurl = curl_init();
    2. // 设置请求头, 有时候需要,有时候不用,看请求网址是否有对应的要求
    3. $header[] = "Content-type: application/x-www-form-urlencoded";
    4. $user_agent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.146 Safari/537.36";
    5. curl_setopt($oCurl, CURLOPT_URL, $sUrl);
    6. curl_setopt($oCurl, CURLOPT_HTTPHEADER,$header);
    7. // 返回 response_header, 该选项非常重要,如果不为 true, 只会获得响应的正文
    8. curl_setopt($oCurl, CURLOPT_HEADER, true);
    9. // 是否不需要响应的正文,为了节省带宽及时间,在只需要响应头的情况下可以不要正文
    10. curl_setopt($oCurl, CURLOPT_NOBODY, true);
    11. // 使用上面定义的 ua
    12. curl_setopt($oCurl, CURLOPT_USERAGENT,$user_agent);
    13. curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1 );
    14. // 不用 POST 方式请求, 意思就是通过 GET 请求
    15. curl_setopt($oCurl, CURLOPT_POST, false);
    16. $sContent = curl_exec($oCurl);
    17. // 获得响应结果里的:头大小
    18. $headerSize = curl_getinfo($oCurl, CURLINFO_HEADER_SIZE);
    19. // 根据头大小去获取头信息内容
    20. $header = substr($sContent, 0, $headerSize);
    21. curl_close($oCurl);

    2.从curl中获取请求头

    1. $oCurl = curl_init();
    2. curl_setopt($oCurl, CURLOPT_URL, "https://117.28.240.235:8002/ipcc/agent/login");
    3. curl_setopt($oCurl, CURLOPT_HTTPHEADER, $header);
    4. //关闭https验证
    5. curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, false);
    6. curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, false);
    7. //至关重要,CURLINFO_HEADER_OUT选项可以拿到请求头信息
    8. curl_setopt($oCurl, CURLINFO_HEADER_OUT, TRUE);
    9. curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1);
    10. curl_setopt($oCurl, CURLOPT_POST, 1);
    11. curl_setopt($oCurl, CURLOPT_POSTFIELDS, $bodystr);
    12. $sContent = curl_exec($oCurl);
    13. //通过curl_getinfo()可以得到请求头的信息
    14. $a=curl_getinfo($oCurl);

    相关知识

    一、JSON与Array之间转换汉字问题

    Array转JSON 问题:

    1. $array = [
    2. 'name' => '张三',
    3. 'age' => 21
    4. ];
    5. echo json_encode($array);
    6. /*
    7. * 结果:
    8. * {"name":"u5f20u4e09","age":21}
    9. */
    10. echo json_encode($array,JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT);
    11. /*
    12. * 结果:
    13. * { "name": "张三", "age": 21 }
    14. */

    JSON转换Array如果遇到汉字问题,则需要下面这种方式来处理:

    1. echo json_decode(trim($post,chr(239).chr(187).chr(191)),TRUE);

    二、对数组排序(属性名字母顺序排序) 小技巧

    1. public function argSort($para)
    2. {
    3. ksort($para);
    4. reset($para);
    5. return $para;
    6. }

    三、数组转换为string

    1. /**
    2. * 将数组转换为string
    3. *
    4. * @param $para 数组
    5. * @param $sort 是否需要排序
    6. * @param $encode 是否需要URL编码
    7. * @return string
    8. */
    9. public function createLinkString($para, $sort, $encode)
    10. {
    11. if ($para == null || !is_array($para)) {
    12. return "";
    13. }
    14. $linkString = "";
    15. if ($sort) {
    16. $para = argSort($para);
    17. }
    18. while (list($key, $value) = each($para)) {
    19. if ($encode) {
    20. $value = urlencode($value);
    21. }
    22. $linkString .= $key . "=" . $value . "&";
    23. }
    24. // 去掉最后一个&字符
    25. $linkString = substr($linkString, 0, count($linkString) - 2);
    26. return $linkString;
    27. }

    四、CURL抓取数据

    PHP的curl功能十分强大,简单点说,就是一个PHP实现浏览器的基础。
    最常用的可能就是抓取远程数据或者向远程POST数据。但是在这个过程中,调试时,可能会有查看header的必要。

    1. echo get('http://www.baidu.com');exit;
    2. function get($url) {
    3. $ch = curl_init();
    4. curl_setopt($ch, CURLOPT_HTTPGET, true);
    5. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //TRUE 将curl_exec()获取的信息以字符串返回,而不是直接输出。
    6. $header = ['User-Agent: php test']; //设置一个你的浏览器agent的header
    7. curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
    8. curl_setopt($ch, CURLOPT_HEADER, 1); //返回response头部信息
    9. curl_setopt($ch, CURLINFO_HEADER_OUT, true); //TRUE 时追踪句柄的请求字符串,从 PHP 5.1.3 开始可用。这个很关键,就是允许你查看请求header
    10. curl_setopt($ch, CURLOPT_URL, $url);
    11. $result = curl_exec($ch);
    12. echo curl_getinfo($ch, CURLINFO_HEADER_OUT); //官方文档描述是“发送请求的字符串”,其实就是请求的header。这个就是直接查看请求header,因为上面允许查看
    13. curl_close($ch);
    14. return $result;
    15. }

    结果如下,很清楚的让你知道在请求URL的过程中,发送的header和返回的header信息:

      1. GET / HTTP/1.1
      2. Host: www.baidu.com
      3. Accept: */*
      4. User-Agent: php test
      5. HTTP/1.1 200 OK
      6. Server: bfe/1.0.8.18
      7. Date: Tue, 04 Jul 2017 01:25:19 GMT
      8. Content-Type: text/html
      9. Content-Length: 2381
      10. Last-Modified: Mon, 23 Jan 2017 13:27:32 GMT
      11. Connection: Keep-Alive
      12. ETag: "588604c4-94d"
      13. Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
      14. Pragma: no-cache
      15. Set-Cookie: BDORZ=27315; max-age=86400; domain=.baidu.com; path=/
      16. Accept-Ranges: bytes
      17. <!DOCTYPE html>
      18. <!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8>
  • 相关阅读:
    一个简单而经典的RTX51 Tiny应用实例
    基于HttpClient 4.3的可訪问自签名HTTPS网站的新版工具类
    动态绑定与动态分发-动态绑定暗含动态分发
    多态是面向接口编程的概念
    多态本质:多个对象共享同一接口 多态本质是共享接口
    Smalltalk
    Simula-Virtual function
    执行力
    目标、计划:下定决心 排除万难
    当断不断,必受其乱
  • 原文地址:https://www.cnblogs.com/yinyusoso/p/9187019.html
Copyright © 2011-2022 走看看