HTTP

作者: 0246eafe46bd | 来源:发表于2021-06-19 18:41 被阅读0次

HTTP定义

HTTP(Hypertext Transfer Protocol)翻译为超文本传输协议,其中的“超文本”可以简单理解为HTML(Hypertext Markup Language),因此HTTP就可以简单理解为传输HTML的相关协议,它规定了请求HTML数据时的请求报文格式规范,以及响应报文的格式规范。
最常使用到HTTP的时候,就是使用浏览器,用户在浏览器地址栏输入地址,例如请求一张图片
https://www.baidu.com/img/flexible/logo/plus_logo_web_2.png,浏览器会分析这个地址,组成HTTP请求报文的格式,再将请求报文发给百度的服务器,其格式大致如下:

请求报文

GET /img/flexible/logo/plus_logo_web_2.png HTTP/1.1
Host: www.baidu.com
User-Agent: Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) 
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 
Mobile Safari/537.36
Accept: 
image/avif,image/webp,image/apng,image/svg+xml,image/*
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: PSTM=1540544696; 
BIDUPSID=715A2A2121C535744832740937F2931C;
......

第一行为请求行,
GET表示请求方式
/img/flexible/logo/plus_logo_web_2.png表示Path路径
HTTP/1.1指明HTTP版本
其余都是Request Headers

响应报文

HTTP/1.1 200 OK 
Accept-Ranges: bytes 
Cache-Control: max-age=315360000 
Content-Length: 21657 
Content-Type: image/png 
Date: Tue, 18 May 2021 11:50:04 GMT 
Etag: "5499-5ad0d9fa31b00" 
Expires: Fri, 16 May 2031 11:50:04 GMT 
Last-Modified: Mon, 17 Aug 2020 07:21:48 GMT 
......

第一行为状态行,
HTTP/1.1指明HTTP版本
200是状态码
OK是状态消息
其余都是Response Headers和内容

请求方法

GET

用于获取数据
不带body
参数在path后面,以?开始,&符号连接多个参数

GET /img/logo/1002?gender=male&age=12 HTTP/1.1 
Host: www.exanple.com

对应 Retrofit 的代码:

@GET("/img/logo/{id}") 
Call getUser(@Path("id") String id, @Query("gender") String gender, @Query("age") int age);

POST

用于修改或增加数据
参数在body中

POST /books HTTP/1.1 
Host: www.exanple.com
Content-Type: application/x-www-form-urlencoded 
Content-Length: 230

name=Android Stydy&type=android

对应 Retrofit 的代码:

@FormUrlEncoded 
@POST("/books")
Call addBook(@Field("bookName") String bookName, @Field("type") String type);

PUT

用于修改数据
参数在body中

POST /books/1002 HTTP/1.1 
Host: www.exanple.com
Content-Type: application/x-www-form-urlencoded 
Content-Length: 45 

name=java

对应 Retrofit 的代码:

@FormUrlEncoded 
@PUT("/books/{id}") 
Call modifyBookType(@Path("id") String id, @Field("bookName") String bookName);

DELETE

用于删除数据
和Get一样没有body

DELETE /books/1002
HTTP/1.1 Host: www.exanple.com

对应 Retrofit 的代码:

@DELETE("/books/{id}") 
Call deleteBook(@Path("id") String id, @Query("bookName") String bookName);

HEAD

与GET方法一样,但返回内容中没有body,只返回Response Headers信息

Headers

Host

目标主机,用于在服务器上定位子服务器

Content-Type

内容类型,主要有以下几种:

1. text/html 文本和html
2. x-www-form-urlencoded 纯文本表单
3. multipart/form-data 二进制文件提交

对应 Retrofit 的代码:

@Multipart 
@POST("/books") 
Call addBook(@Part("bookName") RequestBody bookName, @Part("bookImg") RequestBody bookImg);

RequestBody bookNameBody = RequestBody.create(MediaType.parse("text/plain"), bookName); 
RequestBody bookImgBody = RequestBody.create(MediaType.parse("image/jpeg"), imgFile);
api.addBook(bookNameBody, bookNameBody);
4. application/json , image/jpeg , application/zip

对应 Retrofit 的代码:

@POST("/books") 
Call addBook(@Body("book") Book book); 

... 

// 前提:需要使⽤ JSON 相关的 Converter 
api.addUser(user);

Content-Length

表示 Body 的⻓度(字节)

Transfer-Encoding: chunked

内容分块传输给用户,减少用户等待时间

User-Agent

⽤户代理,指浏览器或者手机APP

Location

重定向的⽬标 URL

Range / Accept-Range

按范围取数据
Accept-Range: bytes 在响应报⽂中出现,表示服务器⽀持按字节来取范围数据
Range: bytes=start-end在请求报⽂中出现,表示要取哪段数据
Content-Range:start-end/total 在响应报⽂中出现,表示发送的是哪段数据
作⽤:断点续传、多线程下载。

Accept

客户端能接受的数据类型。如 text/html

Accept-Charset

客户端接受的字符集。如 utf-8

Accept-Encoding:

客户端接受的压缩编码类型。如 gzip

Content-Encoding

压缩类型。如 gzip

Cache

在客户端或中间⽹络节点缓存数据,降低从服务器取数据的频率,以提⾼⽹
络性能

返回状态码

用于调试,以便于开发人员分析问题
1xx:临时性消息,101(切换HTTP协议)
2xx:成功
3xx:重定向,301(永久移动),302(暂时移动)
4xx:客户端错误,401(认证失败),403(被禁止)404(找不到资源)
5xx:服务端错误,500(服务器内部错误)

相关文章

网友评论

      本文标题:HTTP

      本文链接:https://www.haomeiwen.com/subject/vkelyltx.html