应用层(二)——HTTP协议

应用层(二)

HTTP协议

HTTP请求报文

应用层(二)——HTTP协议_第1张图片

HTTP请求报文分为 请求行,请求头,请求体:

请求行:
  • 格式:请求方式 资源路径 协议/版本
  • 例如:POST /chapter17/user.html HTTP/1.1
  • 请求方式:
  1. get请求:将请求参数追加在url后面,不安全
    url长度限制get请求方式数据的大小
    没有请求体
  2. post请求:
    请求参数在请求体处,较安全。
    请求数据大小没有限制
  3. head请求:
    跟GET相似,不过服务端接收到HEAD请求时只返回响应头,不发送响应内容。
    所以,如果只需要查看某个页面的状态时,用HEAD更高效,因为省去了传输页面内容的时间。
  4. delete请求:
    删除某一个资源。
  5. OPTIONS:返回服务器针对特定资源所支持的HTTP请求方法。也可以利用向Web服务器发送’*’的请求来测试服务器的功能性。
  6. PUT:向指定资源位置上传其最新内容。
  7. TRACE:回显服务器收到的请求,主要用于测试或诊断。
  8. CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
  9. PATCH:PATCH方法出现的较晚,它在2010年的RFC-5789标准中被定义。PATCH请求与PUT请求类似,同样用于资源的更新。二者有以下两点不同:
    PATCH一般用于资源的部分更新,而PUT一般用于资源的整体更新。
    当资源不存在时,PATCH会创建一个新的资源,而PUT只会对已在资源进行更新。
请求头:
Header 解释 示例
Accept 指定客户端能够接收的内容类型 text/plain, text/html
Accept-Charset 浏览器可以接受的字符编码集 iso-8859-5
Accept-Encoding 指定浏览器可以支持的web服务器返回内容压缩编码类型。 compress, gzip
Accept-Language 浏览器可接受的语言 en,zh
Accept-Ranges 可以请求网页实体的一个或者多个子范围字段 bytes
Cache-Control 指定请求和响应遵循的缓存机制 no-cache
Connection 表示是否需要持久连接。(HTTP 1.1默认进行持久连接) close
Content-Length 请求的内容长度 348
Content-Type 请求的与实体对应的MIME信息 application/x-www-form-urlencoded
Date 请求发送的日期和时间 Tue, 15 Nov 2010 08:12:31 GMT
Host 指定请求的服务器的域名和端口号 www.zcmhi.com
If-Modified-Since 如果请求的部分在指定时间之后被修改则请求成功,未被修改则返回304代码(条件请求) Sat, 29 Oct 2010 19:43:31 GMT
Pragma 用来包含实现特定的指令(缓存相关) no-cache
Range 只请求实体的一部分,指定范围(断点传输) bytes=500-999
Referer 先前网页的地址(防盗链) http://www.zcmhi.com/archives/71.html
User-Agent 发出请求的用户信息 Mozilla/5.0 (Linux; X11)
Cookie HTTP请求发送时,会把保存在该请求域名下的所有cookie值一起发送给web服务器。 $Version=1; Skin=new;
请求体

当请求方式是post的时,请求体会有请求的参数,格式如下:username=zhangsan&password=123

HTTP响应报文

HTTP的响应报文:响应行,响应头,响应体
应用层(二)——HTTP协议_第2张图片

响应行:
  • 格式:报文协议+状态码

  • 状态码:
    1xx:指示信息,表示请求已接收,继续处理

    2xx:成功,表示请求已被成功接受,处理。

    • 200 OK:客户端请求成功
    • 204 No Content:无内容。服务器成功处理,但未返回内容。一般用在只是客户端向服务器发送信息,而服务器不用向客户端返回什么信息的情况。不会刷新页面。
    • 206 Partial Content:服务器已经完成了部分GET请求(客户端进行了范围请求)。响应报文中包含Content-Range指定范围的实体内容

    3xx:重定向

    • 301 Moved Permanently:永久重定向,表示请求的资源已经永久的搬到了其他位置。

    • 302 Found:临时重定向,表示请求的资源临时搬到了其他位置

    • 303 See Other:临时重定向,应使用GET定向获取请求资源。303功能与302一样,区别只是303明确客户端应该使用GET访问

    • 307 Temporary Redirect:临时重定向,和302有着相同含义。POST不会变成GET

    • 304 Not Modified:表示客户端发送附带条件的请求(GET方法请求报文中的IF…)时,条件不满足。返回304时,不包含任何响应主体。虽然304被划分在3XX,但和重定向一毛钱关系都没有

      4xx:客户端错误

      • 400 Bad Request:客户端请求有语法错误,服务器无法理解。
      • 401 Unauthorized:客户试图未经授权访问受密码保护的页面。应答中会包含一个WWW-Authenticate头,浏览器据此显示用户名字/密码对话框,然后在填写合适的Authorization头后再次发出请求。
      • 403 Forbidden:资源不可用。服务器理解客户的请求,但拒绝处理它。通常由于服务器上文件或目录的权限设置导致。
      • 404 Not Found:请求资源不存在。比如,输入了错误的url
      • 415 Unsupported media type:不支持的媒体类型

      5xx:服务器端错误,服务器未能实现合法的请求。

      • 500 Internal Server Error:服务器发生不可预期的错误。
      • 501 Not Implemented:服务器不支持实现请求所需要的功能。例如,客户发出了一个服务器不支持的PUT请求。
      • 502 Bad Gateway 服务器作为网关或者代理时,为了完成请求访问下一个服务器,但该服务器返回了非法的应答。
      • 503 Server Unavailable:务器由于维护或者负载过重未能应答。例如,Servlet可能在数据库连接池已满的情况下返回503。服务器返回503时可以提供一个Retry-After头。
      • 504 Gateway Timeout 由作为代理或网关的服务器使用,表示不能及时地从远程服务器获得应答。(HTTP 1.1新)
      • 505 HTTP Version Not Supported 服务器不支持请求中所指明的HTTP版本。(HTTP 1.1新)
        ————————————————
        版权声明:本文为CSDN博主「有抱负的小狮子」的原创文章,原文链接:https://blog.csdn.net/weixin_38087538/article/details/82838762
响应头:
Header 解释 示例
Accept-Ranges 表明服务器是否支持指定范围请求及哪种类型的分段请求 bytes
Cache-Control 告诉所有的缓存机制是否可以缓存及哪种类型 no-cache
Content-Location 请求资源可替代的备用的另一地址 /index.htm
Content-Range 在整个返回体中本部分的字节位置 bytes 21010-47021/47022
Expires 响应过期的日期和时间 Thu, 01 Dec 2010 16:00:00 GMT
Location 用来重定向接收方到非请求URL的位置来完成请求或标识新的资源 http://www.zcmhi.com/archives/94.html
refresh 应用于重定向或一个新的资源被创造,在5秒之后重定向(由网景提出,被大部分浏览器支持) 5; url=http://www.zcmhi.com/archives/94.html
Set-Cookie 设置Http Cookie UserID=JohnDoe; Max-Age=3600; Version=1
Content-Disposition 通过浏览器以下载方式解析正文取值 attachment;filename=xx.zip
Server web服务器软件名称 Apache/1.3.27 (Unix) (Red-Hat/Linux)

更多请求头属性可以参考这篇文章:http://tools.jb51.net/table/http_header

Content-Type详解

应用层(二)——HTTP协议_第3张图片

application/x-www-form-urlencoded

最常见的post提交数据的方式。浏览器原生的form表单,如果不设置enctype属性,那么最终就会以application/x-www-form-urlencoded 方式提交数据
提交的数据按照 key1=val1&key2=val2 的方式进行编码,key 和 val 都进行了 URL 转码。大部分服务端语言都对这种方式有很好的支持。

很多时候,我们用 Ajax 提交数据时,也是使用这种方式。例如 JQuery 和 QWrap 的 Ajax,Content-Type 默认「application/x-www-form-urlencoded;charset=utf-8」。

multipart/form-data

使用表单上传文件时,必须让 form 的 enctyped 等于这个值。


POST http://39.108.107.149:8080/vk/app/rest/ddp/iDataSourcesBaseService/file HTTP/1.1
Content-Type: multipart/form-data; boundary=--------------------------629236571647111133881449
cache-control: no-cache
Postman-Token: 2146b4b3-2d30-469c-bbcd-fbc4693934d9
User-Agent: PostmanRuntime/7.1.1
Accept: */*
Host: 39.108.107.149:8080
cookie: JSESSIONID=6CD80B7028062D9190717CEE001C3194
accept-encoding: gzip, deflate
content-length: 435
Connection: keep-alive
 
----------------------------629236571647111133881449
Content-Disposition: form-data; name="file"; filename="test.txt"
Content-Type: text/plain
 
test upload
----------------------------629236571647111133881449
Content-Disposition: form-data; name="extCode"
 
test
----------------------------629236571647111133881449
Content-Disposition: form-data; name="extId"
 
3306

----------------------------629236571647111133881449--  //结束标识
————————————————

首先生成了一个 boundary 用于分割不同的字段,为了避免与正文内容重复,boundary 很长很复杂。然后 Content-Type 里指明了数据是以 mutipart/form-data 来编码,本次请求的 boundary 是什么内容。

消息主体里按照字段个数又分为多个结构类似的部分,每部分都是以 --boundary 开始,紧接着内容描述信息,然后是回车,最后是最后是字段具体内容(文本或二进制),如果传输的是文件,还要包含文件名和文件类型信息。消息主体最后以 --boundary-- 标示结束。

上面提到的这两种 POST 数据的方式,都是浏览器原生支持的,而且现阶段原生 form 表单也只支持这两种方式。但是随着越来越多的 Web 站点,尤其是 WebApp,全部使用 Ajax 进行数据交互之后,我们完全可以定义新的数据提交方式,给开发带来更多便利。
————————————————

application/json

用来告诉服务端消息主体是序列化后的 JSON 字符串


POST http://39.108.107.149:8080/vk/app/rest/ddp/vkIndexsService/queryVkIndxs HTTP/1.1
Content-Type: application/json
cache-control: no-cache
Postman-Token: 5014bc39-0777-49d5-bb8a-73db9a981e49
User-Agent: PostmanRuntime/7.1.1
Accept: */*
Host: 39.108.107.149:8080
cookie: JSESSIONID=6CD80B7028062D9190717CEE001C3194
accept-encoding: gzip, deflate
content-length: 132
Connection: keep-alive
 
{
    "name":"828验证继承",
    "getresultType":"2",
    "createTime":"Tue Sep 11 2018 00:00:00 GMT+0800 (中国标准时间)"
}
这种方案,可以方便的提交复杂的结构化数据,特别适合 RESTful 的接口。各大抓包工具如 Chrome 自带的开发者工具、Firebug、Fiddler,都会以树形结构展示 JSON 数据,非常友好

 
————————————————

text/xml

版权声明:本文为CSDN博主「有抱负的小狮子」的原创文章
原文链接:https://blog.csdn.net/weixin_38087538/article/details/82838762

你可能感兴趣的:(计算机网络)