php 利用socket发送GET,POST请求

  作为php程序员一定会接触http协议,也只有深入了解http协议,编程水平才会更进一步。最近我一直在学习php的关于http的编程,许多东西恍然大悟,受益匪浅。希望分享给大家。本文需要有一定http基础的开发者阅读。

  今天给大家带来的是如何利用socket发送GET,POST请求。我借用燕十八老师封装好的一个Http类给进行说明。

  在日常编程中相信很多人和我一样大部分时间是利用浏览器向服务器提出GET,POST请求,那么可否利用其它方式提出GET,POST请求呢?答案必然是肯定的。了解过HTTP协议的人知道,浏览器提交请求的实质是向服务器发送一个请求信息,这个请求信息有请求行,请求头,请求体(非必须)构成。服务器根据请求信息返回一个响应信息。连接断开。

  HTTP请求的格式如下所示:

1 <request-line>
2 <headers>
3 <blank line>
4 [<request-body>]

  HTTP响应的格式与请求的格式十分相似:

<status-line>
<headers>
<blank line>

[<response-body>]

  我们可以利用HTTP发送请求的原理,可以重新考虑利用socket发送HTTP请求。

  Socket的英文原义是“孔”或“插座”。通常也称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。如此看来,其实利用socket操作远程文件和读写本地的文件一样容易,把本地文件看成通过硬件传输,远程文件通过网线传输就行了。

  因而可以将发送请求的考虑成 建立连接->打开socket接口(fsockopen())->写入请求(fwrite())->读出响应(fread()->关闭文件(fclose())。话不多说,直接上代码:

  

<?php 

interface Proto {
    // 连接url
    function conn($url);

    //发送get查询
    function get();

    // 发送post查询
    function post();

    // 关闭连接
    function close();
}

class Http implements Proto {

    const CRLF  = "\r\n";

    protected $errno = -1;
    protected $errstr = ‘‘;
    protected $response = ‘‘;

    protected $url = null;
    protected $version = ‘HTTP/1.1‘;
    protected $fh = null;

    protected $line = array();
    protected $header = array();
    protected $body = array();

    public function __construct($url) {
        $this->conn($url);
        $this->setHeader(‘Host: ‘ . $this->url[‘host‘]);
    }

    // 此方法负责写请求行
    protected function setLine($method) {
        $this->line[0] = $method . ‘ ‘ . $this->url[‘path‘] . ‘?‘ .$this->url[‘query‘] . ‘ ‘. $this->version;
    }

    // 此方法负责写头信息
    public function setHeader($headerline) {
        $this->header[] = $headerline;
    }

    // 此方法负责写主体信息
    protected function setBody($body) {
         $this->body[] = http_build_query($body);
    }

    // 连接url
    public function conn($url) {
        $this->url = parse_url($url);
        // 判断端口
        if(!isset($this->url[‘port‘])) {
            $this->url[‘port‘] = 80;
        }

        // 判断query
        if(!isset($this->url[‘query‘])) {
            $this->url[‘query‘] = ‘‘;
        }

        $this->fh = fsockopen($this->url[‘host‘],$this->url[‘port‘],$this->errno,$this->errstr,3);
    }

    //构造get请求的数据
    public function get() {
        $this->setLine(‘GET‘);
        $this->request();
        return $this->response;
    }

    // 构造post查询的数据
    public function post($body = array()) {
        $this->setLine(‘POST‘);

        // 设计content-type
        $this->setHeader(‘Content-type: application/x-www-form-urlencoded‘);

        // 设计主体信息,比GET不一样的地方
        $this->setBody($body);

        // 计算content-length
        $this->setHeader(‘Content-length: ‘ . strlen($this->body[0]));

        $this->request();

        return $this->response;
    }

    // 真正请求
    public function request() {
        // 把请求行,头信息,实体信息 放在一个数组里,便于拼接
        $req = array_merge($this->line,$this->header,array(‘‘),$this->body,array(‘‘));
        //print_r($req);

        $req = implode(self::CRLF,$req);
        //echo $req; exit;

        fwrite($this->fh,$req);

        while(!feof($this->fh)) {
            $this->response .= fread($this->fh,1024);
        }

        $this->close(); // 关闭连接
    }

    // 关闭连接
    public function close() {
        fclose($this->fh);
    }

}

利用此类发送一个简单的GET请求:

<?php

//记得引用Http类
$url="http://home.cnblogs.com/u/DeanChopper/";
$http=new Http($url);

$response=$http->get();

print_r($response);

  返回值为信息,可以对响应信息进行进一步处理,得到自己想得到的内容。

  

  

时间: 2024-10-05 21:58:45

php 利用socket发送GET,POST请求的相关文章

网络编程(一) 利用NSURLSession发送GET POST请求

Xcode 7.0后,http链接不能直接访问(https可以),需要在Info.plist增加下面一项才能正确访问. 使用NSURLSession进行网络请求的流程: 1.构造NSURL 2.构造NSURLRequest请求对象 3.构造NSURLSession会话对象 4.创建网络请求任务:dataTask, downloadTask, uploadTask 5.发送网络请求 1.GET 请求(GET一般用于获取/查询资源信息) - (void)HTTPGET { //1.构造NSURL N

利用jQuery发送ajax异步请求

//很少接触JQuery的Ajax请求 就想着记录一下 到时候有用 $('form').submit(function (e) { // 阻止表单默认提交 e.preventDefault(); var name = $('#name').val(); var password = $('#password').val(); var data = JSON.stringify({"name": name, "password": password}); // 异步发

android 利用socket 发送Json数据demo

客户端代码: package com.yqq.jsonclienttest; import java.io.IOException; import java.io.OutputStream; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; import org.json.JSONException; import org.json.JSONObject; impo

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

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

使用socket发送http请求(GET/POST)

使用socket发送http请求(GET/POST) 下载LOFTER客户端 1.socket的原理 在相关文章中已经提及,不再赘述. 2.http头的格式 (1)请求行请求行由请求方法字段.URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔.例如,GET /index.html HTTP/1.1.HTTP协议的请求方法有GET.POST.HEAD.PUT.DELETE.OPTIONS.TRACE.CONNECT.这里介绍最常用的GET方法和POST方法.GET:当客户端要从服务器中读

socket发送http请求

转自:思齐-socket发送http请求 socket方式: $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); //socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, array("sec"=>20, "usec"=>0)); socket_connect($socket, 'www.baidu.com', 80); //里面的换行代表 \r

php 利用curl发送post请求

利用curl发送post请求完成数据,接口的访问,这里面的参数可以修正一下,就可以写成可以支持文件上传的一个post请求,但是我这里不做仔细的写了.等以后有时间了在考虑怎么分解这个方法: /** * Curl版本 * 使用方法: * $post_string = "app=request&version=beta"; * request_by_curl('http://blog.snsgou.com/restServer.php', $post_string); */ func

利用postman进行接口测试并发送带cookie请求的方法

做web测试的基本上都用用到postman去做一些接口测试,比如测试接口的访问权限,对于某些接口用户A可以访问,用户B不能访问:比如有时需要读取文件的数据.在postman上要实现这样测试,我们就必要要用到cookie请求.用postman发送带cookie的请求,由于chrome安全的限制,postman是发不出带cookie的请求.如果想要发送带cookie的请求,需要开启postman Interceptor. 什么是POSTMAN? POSTMAN是一个Chrome插件工具,我们可以通过

socket发送请求,协程

1.socket发送请求 1 #发送请求的方式 2 3 #方式一 4 import requests 5 6 ret = requests.get("https://www.baidu.com/s?wd=abc") 7 8 print(ret.text) 9 10 11 #方式二 12 13 import socket 14 15 client = socket.socket() 16 client.connect(("www.baidu.com",80)) 17