在php中我们经常用到curl拓展来进行模拟post、get请求,下面就来具体说说怎么模拟:

一、首先模拟post请求:

  1. function http_post_data($url, $query_data,$timeout=30) {
      if(is_array($query_data)){
        $post_str = http_build_query($query_data); //变成 a=1&b=2形式 会进行urlencode()转换
      }
  2. $curl = curl_init(); // 初始化curl
  3. curl_setopt($curl, CURLOPT_URL, $url);
  4. curl_setopt($curl, CURLOPT_HEADER, 0); // 过滤HTTP头
  5. curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 显示输出结果
  6. curl_setopt($curl, CURLOPT_POST, true); // post方式
  7. curl_setopt($curl, CURLOPT_POSTFIELDS, $post_str); // post传输数据
  8. curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 5); // 设置等待时间
  9. curl_setopt($curl,CURLOPT_TIMEOUT,$timeout); // 设置超时
  10. if(strtolower(substr($url,0,5))=='https'){
  11. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
  12. curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
  13. }
  14. //curl_setopt($curl,CURLOPT_CAINFO,dirname(__FILE__).'/cacert.pem')
  15. //如果地址是https协议,且CURLOPT_SSL_VERIFYPEER和CURLOPT_SSL_VERIFYHOST打开了,则需要加载证书
       //根据http://curl.haxx.se/ca/cacert.pem 下载的证书,添加上面注册的这个选项就可以运行正常了
  16. $header = array(
  17. "Content-Type: application/x-www-form-urlencoded; charset=UTF-8"
  18. );
  19. curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
  20. $content = curl_exec($curl);//返回内容
  21. $status = curl_getinfo($curl, CURLINFO_HTTP_CODE);//返回状态码
  22. curl_close($curl);
  23. if($status=='200') return $content;
  24. else return false;
  25. }

模拟get请求就很简单了,直接将post方式改为false,将post传输数据项注释;然后将请求的参数拼接到路径后面就可以了。

上面这种方式如果我们传送数组 或者 a=1&b=2 这样格式的字符串,接受这样的传送,直接用$_POST 或者$_REQUEST就可以获取对应参数的值,至于其他的怎么下面再说。

二、不同的请求头

但有时候我们想要传送json和文件时上面这种方式可能就有点行不通,需要像下面一样该改变请求头

请求json数据:

  1. $header[] = "Content-Type: application/json; charset=utf-8";//声明请求的内容为json
  2. $header[] = "Content-Length:".strlen(json_encode($data));//请求内容的长度

上传文件:

  1. $header[] = "Content-Type:multipart/form-data";//用$_FILES接受传送的文件

请求html数据:

  1. $header[] = "Content-Type:text/html;charset=utf-8";

请求xml数据:

  1. $header[] = "Content-Type:text/xml;charset=utf-8";

还有一种:这种方式,如果浏览器接受到内容,会直接当做纯文本,不会进行html或者xml解析。

  1. $header[] = "Content-Type:text/plain;charset=utf-8";

三、接受请求的几种方式

  1、数组或者a=1&b=2类的字符串

    这个不用多说直接用我们常用的$_GET、$_POST、$_REQUEST就可以接受

  2、json、xml、html或者其他字符串

    PHP默认只识别application/x-www.form-urlencoded标准的数据类型,对xml内容、json内容、html内容的内容无法解析为$_POST数组,因此会保留原型,可以交给file_get_contents(‘php://input’)接收,也可以用$GLOBALS['HTTP_RAW_POST_DATA']。

  1. $xml = file_get_contents("php://input");
  2. //或者
  3. $xml = $GLOBALS['HTTP_RAW_POST_DATA'];

    php://input 允许读取 POST 的原始数据。和$GLOBALS['HTTP_RAW_POST_DATA'] 比起来,它给内存带来的压力较小,并且不需要任何特殊的 php.ini 设置。同时两者皆不能用于接收enctype="multipart/form-data"形式的数据。

四、file_get_contents()模拟请求

  1. function post($url, $content){
  2. $ctx = array(
  3. 'http' => array(
  4. 'method' => 'POST',//或者GET
  5. 'header' => "Content-Type: application/x-www-form-urlencoded",
  6. 'content' => $content
  7. )
  8. );
  9. return file_get_contents($url, false, stream_context_create($ctx));
  10. }

这种方式也可以快速模拟post、get请求,不过这种方式在访问量不大的情况下还没什么问题,如果访问量大可能就会出问题;所以一般在项目中不太推荐这种请求方式。

php中模拟post,get请求和接受请求详细讲解的更多相关文章

  1. Spring中@Transactional事务回滚(含实例详细讲解,附源码)

    一.使用场景举例 在了解@Transactional怎么用之前我们必须要先知道@Transactional有什么用.下面举个栗子:比如一个部门里面有很多成员,这两者分别保存在部门表和成员表里面,在删除 ...

  2. java中模拟http(https)请求的工具类

    在java中,特别是java web中,我们经常需要碰到的一个场景是我们需要从服务端去发送http请求,获取到数据,而不是直接从浏览器输入请求网址获得相应.比如我们想访问微信接口,获取其返回信息. 在 ...

  3. 接口测试中模拟post四种请求数据

    https://www.jianshu.com/p/3b6d7aa2043a 一.背景介绍 在日常的接口测试工作中,模拟接口请求通常有两种方法,fiddler模拟和HttpClient模拟. Fidd ...

  4. Ajax中Get请求与Post请求的区别

    Get请求和Post请求的区别 1.使用Get请求时,参数在URL中显示,而使用Post方式,则不会显示出来 2.使用Get请求发送数据量小,Post请求发送数据量大 例子 页面的HTML代码: &l ...

  5. 限制action所接受的请求方式或请求参数

    原文:http://www.cnblogs.com/liukemng/p/3726897.html 2.限制action所接受的请求方式(get或post): 之前我们在HelloWorldContr ...

  6. 4、处理方法中获取请求参数、请求头、Cookie及原生的servlet API等

    1.请求参数和请求头 使用@RequestParam绑定请求参数,在处理方法的入参处使用该注解可以把请求参数传递给请求方法 —— value :参数名 —— required : 是否必须,默认为tr ...

  7. C#7.2——编写安全高效的C#代码 c# 中模拟一个模式匹配及匹配值抽取 走进 LINQ 的世界 移除Excel工作表密码保护小工具含C#源代码 腾讯QQ会员中心g_tk32算法【C#版】

    C#7.2——编写安全高效的C#代码 2018-11-07 18:59 by 沉睡的木木夕, 123 阅读, 0 评论, 收藏, 编辑 原文地址:https://docs.microsoft.com/ ...

  8. Springmvc之接受请求参数二

    Springmvc之接受请求参数 准备工作 新建一个表单提交 请求地址: http://localhost:8080/ProjectName/user/login.do <form action ...

  9. 【性能压测】:MQ队列异步处理机制导致的系统无法接受请求的问题

    一,最近压测系统交易峰值时,因该支交易采用MQ异步队列处理机制:该增加积分的交易,前段服务器优先返回给客户增加积分成功的结果,后端的MQ队列服务器再慢慢处理该请求: 二,压测过程中出现的问题现象:前几 ...

随机推荐

  1. UIImage分类,设置边框

    #import "UIImage+image.h" @implementation UIImage (image) + (UIImage *)imageWithBorder:(CG ...

  2. 钉钉开发笔记(5)android系统中html软键盘的适配

    最近项目中发现个别Android手机中存在弹出的软键盘会遮挡输入框的现象,最后自己写了一个方法(如下),问题基本解决. 记录下来,防止忘记.有什么不对的地方欢迎指正.O(∩_∩)O 1 //键盘适配 ...

  3. JAVA本地调用(JNI- java调用c)

    记录一下工作内容,对术语了解不多,暂且这样记着吧.  java调用c 一.写jni的步骤如下: 1.创建java类,定义接口函数,使用native修饰: 2.将java类编译成class: 3.将cl ...

  4. A*搜索 概念

    启发式搜索:启发式搜索就是在状态空间中的搜索对每一个搜索的位置进行评估,得到最好的位置,再从这个位置进行搜索直到目标.这样可以省略大量无畏的搜索路径,提到了效率.在启发式搜索中,对位置的估价是十分重要 ...

  5. Oracle 自增长id

    CREATE SEQUENCE to38_import_result_seq INCREMENT BY 1 START WITH 10000 NOMAXVALUE NOCYCLE NOCACHE CR ...

  6. Docker 实现的 redis 主从

    计划用 Docker 实现 Redis 的主从,简单主从而已.主的名称叫 redis-master 一步步来. 先新建个Dockerfile ,从alpine 开始,比较简单. FROM alpine ...

  7. Ubuntu14.04 下安装Samba服务

    1.更改linux镜像源: # vim /etc/apt/sources.list deb http://mirrors.163.com/ubuntu/ trusty main restricted ...

  8. left join、right join、inner join、full join

    转自:某一网友 left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录inner join ...

  9. 【Linux】Vim编辑器

    本文基于Debian 1.vim使用简介 1.1vim安装 使用apt安装vim即可: sudo apt-get install vim 1.2 vim编辑器的模式 vim编辑器分为命令模式和编辑模式 ...

  10. C++对象的virtual table在内存中的布局

    (1)单一继承 (2)多重继承 (3)虚拟继承 参考:<深度探索C++对象模型>