HTTP

webservice = http协议 + XML

Rest = HTTP协议 + json

...

协议有 ftp http stmp pop tcp/ip 等


HTTP请求信息和响应信息的格式

1.请求行

        (1)请求方法 GET POST HEAD PUT DELETE TRACE OPTIONS

        (2)请求路径 http.php

        (3)所用协议 HTTP/1.1

        2.请求头信息

        Host: localhost

        3.请求主体信息

        注意:头信息和主体信息要空一行


1.响应行

        (1)协议版本 HTTP/1.1 200 OK

        (2)状态码   200

        (3)状态文字 OK

        2.响应头信息

        健名:健值

        key:value

        Content-Length:12

        3.响应主体信息


DOS窗口发送HTTP请求方法

1. ipconfig命令查看本机IP

IPv4 地址 . . . . . . . . . . . . : 192.168.1.101

2. telnet 192.168.1.101 80   打开80端口

3. 用 ctrl + ] 再回车  打开回显功能

4. 输入如下内容:

GET /http.php HTTP/1.1

Host: localhost

Content-length: 23

username=admin&pass=123

(两次回车)

然后可看到如下的请求信息

HTTP/1.1 200 OK

Date: Fri, 04 Mar 2016 06:56:41 GMT

Server: Apache/2.4.10 (Win32) OpenSSL/0.9.8zb mod_fcgid/2.3.9

X-Powered-By: PHP/5.4.33

Transfer-Encoding: chunked

Content-Type: text/html

ok这是返回的信息

5.post请求时请求头信息中要加

Content-type: application/x-www-form-urlencoded

示例:

POST /http.php HTTP/1.1

Host: localhost

Content-type: application/x-www-form-urlencoded

Content-length: 25

demo=admin1&test=ppppoopp

问题解决:

        “telnet 不是内部命令” 解决方法:

控制面板->程序->打开或关闭Windows功能,勾上telnet客户端


常见请求方法解释

HEAD查看请求的地址是否正常

PUT向服务器传输内容

TRACE代理访问时查看是否修改请求

OPTION查看服务器允许的请求方法


常见状态码解释

1XX接收到请求继续处理(预留扩展使用)

2XX成功

3XX重定向

4XX客户端错误

5XX服务器端错误


200 服务器返回网页

301/302永久/临时重定向

永久重定向:

header('Location:http://www.chuxiangyi.com',true,301);

304Not Modified 未修改(取缓存)

文件比对信息,缓存是否被修改,请求头信息中添加

If-Modified-Since:Fri, 26 Feb 2016 07:46:08 GMT

If-None-Match:"3000652404"


307重定向中保持原有的数据(防止post请求时数据丢失)

header('Location:http://www.chuxiangyi.com',true,307);

404请求页面不存在

503服务器暂时不可以

500服务器内部错误


PHP + socket请求原理

$fp = fsockopen('192.168.1.101',80, $errno, $errstr, 30);
if (!$fp){
    echo "$errstr ($errno)<br />\n";
}else{
    $out = "GET /demo.php HTTP/1.1\r\n";
    $out .= "Host: localhost\r\n";
    $out .= "Connection: Close\r\n\r\n";
    fwrite($fp, $out);
    while (!feof($fp)){
    echo fgets($fp, 128);
}
    fclose($fp);
}