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(服务器内部错误)













网友评论