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("\r\n\r\n", 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":"\u5f20\u4e09","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>

猜你喜欢

转载自www.cnblogs.com/yinyusoso/p/9187019.html