【荐】怎么用PHP发送HTTP请求(POST请求、GET请求)?

file_get_contents版本:

<?php
/**
 * 发送post请求
 * @param string $url 请求地址
 * @param array $post_data post键值对数据
 * @return string
 */
function send_post($url, $post_data) {

	$postdata = http_build_query($post_data);
	$options = array(
		‘http‘ => array(
			‘method‘ => ‘POST‘,
			‘header‘ => ‘Content-type:application/x-www-form-urlencoded‘,
			‘content‘ => $postdata,
			‘timeout‘ => 15 * 60 // 超时时间(单位:s)
		)
	);
	$context = stream_context_create($options);
	$result = file_get_contents($url, false, $context);

	return $result;
}

使用如下:

$post_data = array(
	‘username‘ => ‘stclair2201‘,
	‘password‘ => ‘handan‘
);
send_post(‘http://blog.snsgou.com‘, $post_data);

实战经验:

当我利用上述代码给另一台服务器发送http请求时,发现,如果服务器处理请求时间过长,本地的PHP会中断请求,即所谓的超时中断,第一个怀疑的是PHP本身执行时间的超过限制,但想想也不应该,因为老早就按照这篇文章设置了“PHP执行时间限制”(【推荐】PHP上传文件大小限制大全 ),仔细琢磨,想想,应该是http请求本身的一个时间限制,于是乎,就想到了怎么给http请求时间限制搞大一点。。。。。。查看PHP手册,果真有个参数 “ timeout ”,默认不知道多大,当把它的值设大一点,问题得已解决,弱弱地做个笔记~~~

Socket版本:

/**
 * Socket版本
 * 使用方法:
 * $post_string = "app=socket&amp;version=beta";
 * request_by_socket(‘blog.snsgou.com‘, ‘/restServer.php‘, $post_string);
 */
function request_by_socket($remote_server,$remote_path,$post_string,$port = 80,$timeout = 30) {
	$socket = fsockopen($remote_server, $port, $errno, $errstr, $timeout);
	if (!$socket) die("$errstr($errno)");
	fwrite($socket, "POST $remote_path HTTP/1.0");
	fwrite($socket, "User-Agent: Socket Example");
	fwrite($socket, "HOST: $remote_server");
	fwrite($socket, "Content-type: application/x-www-form-urlencoded");
	fwrite($socket, "Content-length: " . (strlen($post_string) + 8) . "");
	fwrite($socket, "Accept:*/*");
	fwrite($socket, "");
	fwrite($socket, "mypost=$post_string");
	fwrite($socket, "");
	$header = "";
	while ($str = trim(fgets($socket, 4096))) {
		$header .= $str;
	}

	$data = "";
	while (!feof($socket)) {
		$data .= fgets($socket, 4096);
	}

	return $data;
}

Curl版本:

/**
 * Curl版本
 * 使用方法:
 * $post_string = "app=request&version=beta";
 * request_by_curl(‘http://blog.snsgou.com/restServer.php‘, $post_string);
 */
function request_by_curl($remote_server, $post_string) {
	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL, $remote_server);
	curl_setopt($ch, CURLOPT_POSTFIELDS, ‘mypost=‘ . $post_string);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($ch, CURLOPT_USERAGENT, "snsgou.com‘s CURL Example beta");
	$data = curl_exec($ch);
	curl_close($ch);

	return $data;
}

Curl版本(2)

/**
 * 发送HTTP请求
 *
 * @param string $url 请求地址
 * @param string $method 请求方式 GET/POST
 * @param string $refererUrl 请求来源地址
 * @param array $data 发送数据
 * @param string $contentType
 * @param string $timeout
 * @param string $proxy
 * @return boolean
 */
function send_request($url, $data, $refererUrl = ‘‘, $method = ‘GET‘, $contentType = ‘application/json‘, $timeout = 30, $proxy = false) {
	$ch = null;
	if(‘POST‘ === strtoupper($method)) {
		$ch = curl_init($url);
		curl_setopt($ch, CURLOPT_POST, 1);
		curl_setopt($ch, CURLOPT_HEADER,0 );
		curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);
		curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
		if ($refererUrl) {
			curl_setopt($ch, CURLOPT_REFERER, $refererUrl);
		}
		if($contentType) {
			curl_setopt($ch, CURLOPT_HTTPHEADER, array(‘Content-Type:‘.$contentType));
		}
		if(is_string($data)){
			curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
		} else {
			curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
		}
	} else if(‘GET‘ === strtoupper($method)) {
		if(is_string($data)) {
			$real_url = $url. (strpos($url, ‘?‘) === false ? ‘?‘ : ‘‘). $data;
		} else {
			$real_url = $url. (strpos($url, ‘?‘) === false ? ‘?‘ : ‘‘). http_build_query($data);
		}

		$ch = curl_init($real_url);
		curl_setopt($ch, CURLOPT_HEADER, 0);
		curl_setopt($ch, CURLOPT_HTTPHEADER, array(‘Content-Type:‘.$contentType));
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
		if ($refererUrl) {
			curl_setopt($ch, CURLOPT_REFERER, $refererUrl);
		}
	} else {
		$args = func_get_args();
		return false;
	}

	if($proxy) {
		curl_setopt($ch, CURLOPT_PROXY, $proxy);
	}
	$ret = curl_exec($ch);
	$info = curl_getinfo($ch);
	$contents = array(
			‘httpInfo‘ => array(
					‘send‘ => $data,
					‘url‘ => $url,
					‘ret‘ => $ret,
					‘http‘ => $info,
			)
	);

	curl_close($ch);
	return $ret;
}

调用 WCF接口 的一个例子:$json = restRequest($r_url,‘POST‘, json_encode($data));

时间: 2024-07-31 08:46:31

【荐】怎么用PHP发送HTTP请求(POST请求、GET请求)?的相关文章

HTTP 笔记与总结(1 )Telnet 分别发送 HTTP GET 和 HTTP POST 请求

简化的说: WebService = HTTP 协议 + XML Rest = HTTP 协议 + Json 各种 API = HTTP 协议 + XML / Json 来实现 HTTP 请求信息格式 ① 请求行 a.请求方法:GET,POST,PUT,DELETE,TRACE,OPTIONS b.请求路径(请求的资源,URL 的一部分) c.所用协议 ② 请求头信息 ③ 请求主体信息 HTTP 请求除了浏览器,其他只要满足 HTTP 协议的工具都可以发送 HTTP 请求,例如 Telnet(T

发送带有认证信息的HTTP请求并取回响应

问题 如何发送 一个带有网络认证证书的HTTP请求并返回相应的HTTP响应. 设计 创建一个WebRequest对象和一个NetWorkCredential对象.把NetWorkCredential对象作为WebRequest对象的Credentials的属性赋给它并且通过WebRequest.GetResponse()方法返回HTTP响应. 方案 public static void Credential() { string url = "http://server/path/webform

使用火狐的restclient发送http接口post及get请求

1.在firefox安装restclient插件,具体参照http://jingyan.baidu.com/article/1876c8529b07e3890b137623.html: —.发送post请求,选择post方式 1.请求参数为一个或,多个字段(请求头headers填:application/x-www-form-urlencoded) 例如接口有A,B两请求字段,body填入A=1&&B=2,多个字段body用&&拼接. ps:不论接口中A,B字段什么类型,都

TCP Incast 问题TCP INCAST解决思路 应用场景:在集群文件系统内,客户端应用请求某个逻辑数据块(通常情况下一个读数据块大小是1MB),该数据块以条带化方式分别存储在几个存储服务器上,即采用更小的数据片存储(32KB,256KB等),这种小数据片称为服务器请求单元(SRU)。只有当客户端接收到所有的服务器返回的其所请求数据块的SRU后才继续发送出下一个数据块请求,即客户端同时向

TCP INCAST解决思路 应用场景:在集群文件系统内,客户端应用请求某个逻辑数据块(通常情况下一个读数据块大小是1MB),该数据块以条带化方式分别存储在几个存储服务器上,即采用更小的数据片存储(32KB,256KB等),这种小数据片称为服务器请求单元(SRU).只有当客户端接收到所有的服务器返回的其所请求数据块的SRU后才继续发送出下一个数据块请求,即客户端同时向多个存储服务器发起并发TCP请求,且所有服务器同时向客户端发送SRU. 出现的问题: 1)         这种多对一的服务器向客

发送一个简单的http get 请求并且响应

问题 如何发送一个简单的HTTP GET请求并且取回相应的HTTP响应. 设计 创建一个WebClient类的实例,然后使用它的DownloadData()方法. 方案 string uri = "http://server/path/WebForm.aspx"; WebClient wc = new WebClient(); Console.WriteLine("Sending an HTTP GET request to " + uri); byte[] bRe

cors跨域之简单请求与预检请求(发送请求头带令牌token)

跨域浏览器请求应该是可以发出的,服务器不响应这种请求,同时跨域标准还要求浏览器不接受不同域名的服务器发来的响应.个人猜测 预检请求(option):在 CORS 中,可以使用 OPTIONS 方法发起一个预检请求(一般都是浏览检测到请求跨域时,会自动发起),以检测实际请求是否可以被服务器所接受.预检请求报文中的 Access-Control-Request-Method 首部字段告知服务器实际请求所使用的 HTTP 方法:Access-Control-Request-Headers 首部字段告知

vue发送websocket请求和http post请求

直接上代码: pdf.vue 1 <script> 2 import SockJS from 'sockjs-client'; 3 import Stomp from 'stompjs'; 4 import qs from "qs" 5 6 export default { 7 name: "pdf", 8 data() { 9 return { 10 newsData: [], 11 tagGuid_mx: "", 12 tagGu

requests(一): 发送一个json格式的post请求

总结一下问题所在 ,今天我也遇到这个问题了,所以请教了一下下列博文的博主,小简姐姐 总结:我们平常请求都是字典格式 ,有些post接口可能限制只能json格式,所以你请求时候 data=data ,会请求失败 json=data ,请求参数是json格式.....成长道路的小白,遇到问题就记录下,希望能帮到大家 今天给一位同学解决post发送数据格式为json格式的请求,顺便确认一下问题归属. 背景: 用postman工具发送一个数据格式为json的请求,得到了服务器的响应. 用python的r

AJAX请求和跨域请求详解(原生JS、Jquery)

一.概述 AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术. AJAX = 异步 JavaScript 和 XML,是一种用于创建快速动态网页的技术.通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新.传统的网页(不使用 AJAX)如果需要更新内容,必需重载整个网页面. 本博客实验环境: python:2.7.11 web框架:tonado jquery:2.1.1 二.“伪”AJAX 由于

Ajax异步请求XMLHttpRequest对象Get请求

$(function () { $("#btnGetDate").click(function () { var xhr; //第一步:创建异步请求的核心的对象: if (XMLHttpRequest) { xhr = new XMLHttpRequest(); //运行:is8,ie9,chrom,ff } else {//ie6 ie5.x xhr = new ActiveXObject("Microsoft.XMLHTTP"); } //第二步:设置请求对象跟