怎么用PHP发送HTTP请求(POST请求、GET请求)?
file_get_contents版本:
01 /**
02 * 发送post请求
03 * @param string $url 请求地址
04 * @param array $post_data post键值对数据
05 * @return string
06 */
07 function send_post($url, $post_data) {
08
09 $postdata = http_build_query($post_data);
10 $options = array(
11 'http' =>; array(
12 'method' =>; 'POST',
13 'header' =>; 'Content-type:application/x-www-form-urlencoded',
14 'content' =>; $postdata,
15 'timeout' =>; 15 * 60 // 超时时间(单位:s)
16 )
17 );
18 $context = stream_context_create($options);
19 $result = file_get_contents($url, false, $context);
20
21 return $result;
22 }
使用如下:
1 post_data = array(
2 'username' => 'stclair2201',
3 'password' => 'handan'
4 );
5 send_post('http://blog.snsgou.com', $post_data);
实战经验:
当我利用上述代码给另一台服务器发送http请求时,发现,如果服务器处理请求时间过长,本地的PHP会中断请求,即所谓的超时中断,第一个怀疑的是PHP本身执行时间的超过限制,但想想也不应该,因为老早就按照这篇文章设置了“PHP执行时间限制”(【推荐】PHP上传文件大小限制大全 ),仔细琢磨,想想,应该是http请求本身的一个时间限制,于是乎,就想到了怎么给http请求时间限制搞大一点。。。。。。查看PHP手册,果真有个参数 “ timeout ”,默认不知道多大,当把它的值设大一点,问题得已解决,弱弱地做个笔记~~~
Socket版本:
01 /**
02 * Socket版本
03 * 使用方法:
04 * $post_string = "app=socket&version=beta";
05 * request_by_socket('blog.snsgou.com', '/restServer.php', $post_string);
06 */
07 function request_by_socket($remote_server,$remote_path,$post_string,$port = 80,$timeout = 30) {
08 $socket = fsockopen($remote_server, $port, $errno, $errstr, $timeout);
09 if (!$socket) die("$errstr($errno)");
10 fwrite($socket, "POST $remote_path HTTP/1.0");
11 fwrite($socket, "User-Agent: Socket Example");
12 fwrite($socket, "HOST: $remote_server");
13 fwrite($socket, "Content-type: application/x-www-form-urlencoded");
14 fwrite($socket, "Content-length: " . (strlen($post_string) + 8) . "");
15 fwrite($socket, "Accept:*/*");
16 fwrite($socket, "");
17 fwrite($socket, "mypost=$post_string");
18 fwrite($socket, "");
19 $header = "";
20 while ($str = trim(fgets($socket, 4096))) {
21 $header .= $str;
22 }
23
24 $data = "";
25 while (!feof($socket)) {
26 $data .= fgets($socket, 4096);
27 }
28
29 return $data;
30 }
Curl版本:
01 /**
02 * Curl版本
03 * 使用方法:
04 * $post_string = "app=request&version=beta";
05 * request_by_curl('http://blog.snsgou.com/restServer.php', $post_string);
06 */
07 function request_by_curl($remote_server, $post_string) {
08 $ch = curl_init();
09 curl_setopt($ch, CURLOPT_URL, $remote_server);
10 curl_setopt($ch, CURLOPT_POSTFIELDS, 'mypost=' . $post_string);
11 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
12 curl_setopt($ch, CURLOPT_USERAGENT, "snsgou.com's CURL Example beta");
13 $data = curl_exec($ch);
14 curl_close($ch);
15
16 return $data;
17 }
Curl版本(2)
01 /**
02 * 发送HTTP请求
03 *
04 * @param string $url 请求地址
05 * @param string $method 请求方式 GET/POST
06 * @param string $refererUrl 请求来源地址
07 * @param array $data 发送数据
08 * @param string $contentType
09 * @param string $timeout
10 * @param string $proxy
11 * @return boolean
12 */
13 function send_request($url, $data, $refererUrl = '', $method = 'GET', $contentType = 'application/json', $timeout = 30, $proxy = false) {
14 $ch = null;
15 if('POST' === strtoupper($method)) {
16 $ch = curl_init($url);
17 curl_setopt($ch, CURLOPT_POST, 1);
18 curl_setopt($ch, CURLOPT_HEADER,0 );
19 curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1);
20 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
21 curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);
22 curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
23 if ($refererUrl) {
24 curl_setopt($ch, CURLOPT_REFERER, $refererUrl);
25 }
26 if($contentType) {
27 curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:'.$contentType));
28 }
29 if(is_string($data)){
30 curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
31 } else {
32 curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
33 }
34 } else if('GET' === strtoupper($method)) {
35 if(is_string($data)) {
36 $real_url = $url. (strpos($url, '?') === false ? '?' : ''). $data;
37 } else {
38 $real_url = $url. (strpos($url, '?') === false ? '?' : ''). http_build_query($data);
39 }
40
41 $ch = curl_init($real_url);
42 curl_setopt($ch, CURLOPT_HEADER, 0);
43 curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:'.$contentType));
44 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
45 curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
46 if ($refererUrl) {
47 curl_setopt($ch, CURLOPT_REFERER, $refererUrl);
48 }
49 } else {
50 $args = func_get_args();
51 return false;
52 }
53
54 if($proxy) {
55 curl_setopt($ch, CURLOPT_PROXY, $proxy);
56 }
57 $ret = curl_exec($ch);
58 $info = curl_getinfo($ch);
59 $contents = array(
60 'httpInfo' => array(
61 'send' => $data,
62 'url' => $url,
63 'ret' => $ret,
64 'http' => $info,
65 )
66 );
67
68 curl_close($ch);
69 return $ret;
70 }
调用 WCF接口 的一个例子:$json = restRequest($r_url,'POST', json_encode($data));
怎么用PHP发送HTTP请求(POST请求、GET请求)?的更多相关文章
- HTTP 笔记与总结(1 )Telnet 分别发送 HTTP GET 和 HTTP POST 请求
简化的说: WebService = HTTP 协议 + XML Rest = HTTP 协议 + Json 各种 API = HTTP 协议 + XML / Json 来实现 HTTP 请求信息格式 ...
- 使用火狐的restclient发送http接口post及get请求
1.在firefox安装restclient插件,具体参照http://jingyan.baidu.com/article/1876c8529b07e3890b137623.html: —.发送pos ...
- 发送一个简单的http get 请求并且响应
问题 如何发送一个简单的HTTP GET请求并且取回相应的HTTP响应. 设计 创建一个WebClient类的实例,然后使用它的DownloadData()方法. 方案 string uri = &q ...
- 使用Ajax发送http请求(get&post请求)
本文最初发表于博客园,并在GitHub上持续更新前端的系列文章.欢迎在GitHub上关注我,一起入门和进阶前端. 以下是正文. 同步和异步 同步和异步的概念 同步:必须等待前面的任务完成,才能继续后面 ...
- requests(一): 发送一个json格式的post请求
今天给一位同学解决post发送数据格式为json格式的请求,顺便确认一下问题归属. 背景: 用postman工具发送一个数据格式为json的请求,得到了服务器的响应. 用python的requests ...
- Linux命令发送Http的get或post请求(curl和wget两种方法)
Http请求指的是客户端向服务器的请求消息,Http请求主要分为get或post两种,在Linux系统下可以用curl和wget命令来模拟Http的请求.下面就来介绍一下Linux系统如何模拟Http ...
- axios添加了header信息后发送的get请求自动编程option请求了
axios添加了header信息后发送的get请求自动编程option请求了 webpack 代理转发 Provisional headers are shown 在Vue中如何使用axios跨域访问 ...
- 前端控制器是整个MVC框架中最为核心的一块,它主要用来拦截符合要求的外部请求,并把请求分发到不同的控制器去处理,根据控制器处理后的结果,生成相应的响应发送到客户端。前端控制器既可以使用Filter实现(Struts2采用这种方式),也可以使用Servlet来实现(spring MVC框架)。
本文转自http://www.cnblogs.com/davidwang456/p/4090058.html 感谢作者 前端控制器是整个MVC框架中最为核心的一块,它主要用来拦截符合要求的外部请求,并 ...
- vue发送websocket请求和http post请求
直接上代码: pdf.vue <script> import SockJS from 'sockjs-client'; import Stomp from 'stompjs'; impor ...
- 使用 Promise 实现任务队列发送请求,实现最大请求数目限制
核心 设置最大请求数量,当前请求数量,待执行队列 调用时,创建一个新任务,然后判断是否达到最大请求数量,若达到则将任务追加到待执行队列,否则,则直接执行该任务.并返回Promise 创建任务时,需要返 ...
随机推荐
- dokcer 的export 、improt和save 、load
export .improt 是对容器操作也就是类似于虚拟机的快照 save .load 是针对于镜像操作的..
- sgi stl内存池实现------源码加翻译
class __default_alloc_template { enum { unit = 8 };//分配单位 后面直接用8代替 enum { max_bytes = 128 };//最大分配字节 ...
- “全栈2019”Java第一百零六章:匿名内部类与抽象类接口注意事项
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- 洛谷P5292 [HNOI2019]校园旅行(二分图+最短路)
题面 传送门 题解 如果暴力的话,我们可以把所有的二元组全都扔进一个队列里,然后每次往两边更新同色点,这样的话复杂度是\(O(m^2)\) 怎么优化呢? 对于一个同色联通块,如果它是一个二分图,我们只 ...
- jquery源码解析:jQuery数据缓存机制详解2
上一课主要讲了jQuery中的缓存机制Data构造方法的源码解析,这一课主要讲jQuery是如何利用Data对象实现有关缓存机制的静态方法和实例方法的.我们接下来,来看这几个静态方法和实例方法的源码解 ...
- string、char *的转换
string转char* 主要有三种方法可以将str转换为char*类型,分别是:data(); c_str(); copy(); data()方法 string str = "hello& ...
- 基于Anaconda 安装 geatpy 和 tensorflow
装了好久的第三方包终于成功了,暴风哭泣!!!总结一下 分两部分说: 一. 首先是在本地电脑windows系统下装: 首先安利一下这个包括各种 Genetic and Evolutionary Algo ...
- /usr/bin/ld: cannot find -lperconaserverclient_r 解决
编译sqladvisor安装遇到: [root@localhost sqladvisor]# cd SQLAdvisor/sqladvisor/ [root@localhost sqladvisor] ...
- 使用NHibernate(2)-- 让程序跑起来
1, 创建一个MVC的程序,NHibernateDemo,并用NuGet安装NHibernate. 安装引用后,NuGet会自动安装NHibernate所依赖的类库 Iesi.Collections ...
- Linux C笔记
<Linux C编程一站式学习>笔记 gcc编译 直接编译 gcc main.c a.out 指定可执行文件名 gcc main.c -o main main 提示所有的警告信息 gcc ...