HTTP学习

主要翻译了http://www.jmarshall.com/easy/http/的内容

HTTP是指Hypertext Transfer Protocol,用于在互联网上传输文件或者其他资源,HTTP通常通过TCP/IP socket进行。一个浏览器可以视作一个HTTP client,向HTTP server(Web server)发送请求并接收响应。标准的HTTP server监听的端口为80.


HTTP 传输的结构

HTTP也是采用client-server模型:一个HTTP client开启一个连接,并且向HTTP server发送一个request 信息,之后HTTP server返回一个response信息,通常包含了之前所请求的资源,在发送response之后,server关闭连接。
request和response信息类似,都包含下列内容:

  • 一条初始化行
  • 0条或者多条header行
  • 一条空行(通常是回车换行)
  • body部分(optional),可以是文件,数据或者输出等等

下面分别介绍各部分内容

request的初始化行

主要包含三部分内容,以空格隔开:请求的方法,所请求的资源的路径,以及HTTP协议的版本,如:

GET /path/to/file/index.html HTTP/1.0

  • GET是方法名,还有一些其他的方法如POST, HEAD在之后会进行介绍,方法名都是大写
  • 路径部分是指host之后的URL部分
  • HTTP版本通常是采用 ‘HTTP/x.x’的格式
response的初始化行

又称为status line,也包含三部分,以空格隔开:HTTP版本,响应的状态码以及描述状态码的短语,如:

HTTP/1.0 200 OK
HTTP/1.0 404 Not Found

主要介绍下状态码,状态码是一个三位数的数字,第一个数字表示response的类别:

  • 1xx表示这只是一条信息
  • 2xx表示成功
  • 3xx表示重定向到了另一个URL
  • 4xx表示client部分的错误
  • 5xx表示server部分的错误

常见的状态码有:
200 OK
请求成功,并且资源返回在了body中
404 Not Found
请求的资源不存在
301 Moved Permanently
302 Moved Temporarily
303 See Other(只支持HTTP 1.1)
资源被移动到了另一个URL中(由Location:response header提供),并且应当由client自动取回。通常由CGI脚本将浏览器重定向到一个已存在的文件
500 Server Error*
未预料的服务器端错误

header行

header行通常提供request或response的信息,或者是body中物体的信息
通常采用 ‘Header-Name: value’的格式,以回车换行结束

  • 应以回车换行符结束,但也应该可以处理换行符
  • header的名字不区分大小写,但是value区分
  • ‘:’和value之间可以存在多个空格或者tab
  • 以空格或者tab开头的header行是前一个header行的部分,分成多行是为了便于阅读

以下两个header其实是等价的:

Header1: some-long-value-1a, some-long-value-1b

HEADER1: some-long-value-1a,
some-long-value-1b

为了保证一致性,考虑在request的header中加入以下内容:

  • From: header给了请求人的email地址。(为了隐私考虑,需要用户可配置)
  • User-Agent: 标识发送请求的程序,以’Program-name/x.xx’的形式。

header可以有助于寻找故障,但也会泄露用户信息,因此需要权衡对待。

如果写server,则考虑在response中增加以下信息:

  • Server:和User-Agent类似。
  • Last-Modified:给出资源上次修改的时间。
body行

如果HTTP信息中包含有body,那么通常在header行中有相关的描述部分。
Content-Type: 给出body中数据的类型
Content-Length: 给出body中的字节个数


举一个例子
为了获取http://www.somehost.com/path/file.html中的文件

  • 首先,对www.somehost.com,端口80(URL中没有指定端口)建立一个socket。
  • 之后,发送下列信息

GET /path/file.html HTTP/1.0
From: someuser@jmarshall.com
User-Agent: HTTPTool/1.0
[blank line here]

server应该返回一个响应信息,类似于

HTTP/1.0 200 OK
Date: Fri, 31 Dec 1999 23:59:59 GMT
Content-Type: text/html
Content-Length: 1354

<html>
<body>
<h1>Happy New Millennium!</h1>
(more file contents)
  .
  .
  .
</body>
</html>

发送之后,server关闭socket


一些HTTP method介绍

除了GET之外,最常用的方法就是POST和HEAD

HEAD和GET类似,但只要求server返回response header,而不需要返回真实的资源,只要用于在不下载资源的情况下进行检查,节省带宽。
对HEAD的相应不包含body。

POST用来发送数据给server,和CGI脚本类似。

  • request的body中含有数据,也有相应的header描述body,如Content-Type和Content-Length
  • 请求的URI并不是用来获取资源,而是处理你所发送数据的程序
  • HTTP相应通常是程序的输出,而不是一个静态文件。

GET其实也可以用来提交表单,当数据量比较小的时候,将表单数据进行URL-encoded,并加在请求的URI后面。


HTTP代理

HTTP代理是client和server之间的中间人,需要接收client的request,还需要将其转发到server中,并接受server的response,并发送回去。因此,需要具有client和server的功能。

client在使用代理时,将所有的请求都发送给代理,而不是发送到URL的server中,request中不仅仅包含路径,而是含有完整的URL,如:

GET http://www.somehost.com/path/file.html HTTP/1.0


兼容性

你所交互的一些client或者server的信息可能有一些缺陷,但是你应该容忍这些缺陷。

  • 虽然header行应该以回车换行符结束,但是也需要接受换行符
  • 虽然initial行应该以一个空格隔开,但是也应该接受其他数量的空格或者tab

具体可以查阅HTTP Specification

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值