PHP+Socket模拟发送GET、POST请求

/**
 * 使用PHP Socket 编程模拟Http post和get请求
 * @author koma
 */
class Http{
	private $sp = "\r\n"; //这里必须要写成双引号
	private $protocol = ‘HTTP/1.1‘;
	private $requestLine = "";
	private $requestHeader = "";
	private $requestBody = "";
	private $requestInfo = "";
	private $fp = null;
	private $urlinfo = null;
	private $header = array();
	private $body = array();

	public function __construct($url) {
		$this->parseurl($url);
		$port = isset($this->urlinfo[‘port‘]) ? isset($this->urlinfo[‘port‘]) : ‘80‘;
		/*
		 * 注意:这里的fsockopen中的url参数形式为"www.xxx.com"
		 * 不能够带"http://"这种
		 */
		$this->fp = fsockopen($this->urlinfo[‘host‘], $port, $errno, $errstr, 30);
		if ( !$this->fp ) {
			echo $errstr.‘(‘.$errno.‘)‘;
			exit();
		}
		$this->header[‘Host‘] = $this->urlinfo[‘host‘];
	}

	public function get($header = array(), $body = array()) {
		$this->header = array_merge($this->header, $header);
		$this->body = $body;
		$this->request(‘GET‘);
	}

	public function post($header = array(), $body = array()) {
		$this->header = array_merge($this->header, $header);
		$this->body = $body;
		$this->request(‘POST‘);
	}

	private function request($method) {
		$header = "";
		$this->requestLine = $method.‘ ‘.$this->urlinfo[‘path‘].‘ ‘.$this->protocol;
		foreach ( $this->header as $key => $value ) {
			$header .= $header == "" ? $key.‘:‘.$value : $this->sp.$key.‘:‘.$value;
		}
		$this->requestHeader = $header.$this->sp.$this->sp;
		$this->requestInfo = $this->requestLine.$this->sp.$this->requestHeader;
		if ( !empty($this->body) ) {
			$body = "";
			foreach ( $this->body as $key => $value ) {
				$body .= $body == "" ? $key.‘=‘.$value : ‘&‘.$key.‘=‘.$value;
			}
			$this->requestInfo .= $body;
		}
		if ( fwrite($this->fp, $this->requestInfo) ) {
			while ( !feof($this->fp) ) {
				$str = fread($this->fp, 1024);
				echo $str;
			}
		}
		fclose($this->fp);
	}

	private function parseurl($url) {
		$this->urlinfo = parse_url($url);
	}
}
$url = "http://news.163.com/14/1102/01/AA0PFA7Q00014AED.html";
$http = new Http($url);
/* 发送get请求 */
echo $http->get(array(
	‘User-Agent‘ => ‘Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36‘,
));

/* 发送post请求
echo $http->post(array(
		‘User-Agent‘ => ‘Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36‘,
		//对于post请求必须增加这两项
		‘Content-Length‘ => 20,
		‘Content-Type‘ => ‘application/x-www-form-urlencoded‘
), array(‘username‘=>‘koma‘, ‘age‘=>22));
*/

看一看,你怎么看?欢迎指正!

时间: 2025-01-15 02:23:37

PHP+Socket模拟发送GET、POST请求的相关文章

php+socket模拟表单发送请求

1 <?php 2 /** 3 * http请求类(php + socket) 4 * @todo 这里还有很多未完善的地方,仅有简单的get post head请求 5 * @author [email protected] 6 * @version 1.0.0 7 */ 8 9 class HttpClient { 10 11 const CRLF = "\r\n"; 12 private $fh = null; //socket handle 13 private $err

python用socket模拟post请求

今天用python的socket模拟了下post请求,通过这个实例可以更加了解python中socket的使用,以及http请求和socket的相互关系等知识. #coding=utf-8 import socket if __name__=="__main__": s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(("www.xxxxx.com",80)) #pyhon 字符串很长时可以

php 中使用cURL发送get/post请求,上传图片,批处理

cURL是利用url语法规定传输文件和数据的工具.php中有curl拓展,一般用来实现网络抓取,模拟发送get   post请求,文件上传. 在php中建立curl的基本步骤如下: 1 初始化        2 设置选项,包括url        3  执行并获取结果   4 释放curl句柄. 在工作和学习中,我也是时常用的curl.由于在使用curl设置选项时,各种选项比较难以记忆,需要参考,故在此记录下常用的一些例子,以便后来参考. 实例一 : 抓取网页数据(以拉手网开放api为例,也是g

Socket 模拟HTTP客户端请求

1 import java.io.IOException; 2 import java.io.InputStream; 3 import java.io.OutputStreamWriter; 4 import java.net.InetAddress; 5 import java.net.Socket; 6 import java.net.UnknownHostException; 7 import java.util.ArrayList; 8 9 /** 10 * 一个简单的HTTP客户端,

Python socket模拟HTTP请求

0x00 起 最近在做一个对时间要求比较高的扫描器,需要封装一下SOCKET模拟HTTP发包的一些常用函数.简单的说,就是重写一下requests中的get.post方法. 今天在写的时候,遇到一枚很奇怪的问题,对同一个URL,POST请求能正常返回信息,而一旦切到GET,socket time out. 伪代码如下: get_str = 'GET %s HTTP/1.1\r\nHost: %s\r\nUser-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64)

利用socket模拟http的混合表单上传(在一个请求中提交表单并上传多个文件)

在很多企业级应用中,我们都没法直接通过开发语言sdk包封装的http工具来模拟http复合表单(multipart/form-data),特别是在跨语言跨平台的编程过程中,其实实现方案并不复杂,只要你了解了http协议中复合表单的报文结构就很简单了: httpheader ------时间戳------ 表单参数1 ------时间戳------ 表单参数2 ------时间戳------ 文件1的描述+二进制信息 ------时间戳------ 文件2的描述+二进制信息 下面我们进一步以一段c

PHP+SOCKET 模拟HTTP请求

HTTP消息结构 客户端请求包括四部份:请求行(状态行).请求头.空行.请求主体(数据),如下图: 服务端响应包括四部份:响应行(状态行).响应头.空行.响应主体(数据),如图: HTTP请求方法: POST .GET  .HEADE.  PUT.  TRACE  .DELETE .OPTIONS .CONNECT  (前三种最实用),有这麽多的请求方法,但web服务器不一定所有的都支持. GET   基本一致,请求指定的页面信息,并返回实体主体. HEAD  基本和GET一致 ,只不过返回的响

利用fiddler模拟发送json数据的post请求

fiddler是调试利器,有许多好用的功能,这里简单的介绍一下利用fiddler模拟发送post请求的例子 先简单介绍一下失败的例子,最后给出正确的方法 在fiddler里边按照图上所示的设置好之后,点击右上角的execute,会报错 看下原因说的是后端不支持你提交数据的格式,也就是你发送的数据格式不对,可以添加请求头即可 如图设置 这样就ok了 利用fiddler的模拟post请求的时候,自己可以根据报错,修改就ok

用java模拟发送post请求

package com.bytestream.practice.demo;import java.io.BufferedReader;import java.io.File;import java.io.FileReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.URL;import java.net.URLConnection;