概念
传输超文本的网络协议。
超文本: 扩展型(Hyper)文本。早期就特别用来传输HTML内容
原理
URL
协议类型
: //服务器地址[:端口号]
/路径
http
: //wxsmile.com
/user/1
?gender=male
报文
-
请求报文
请求行(Method、path、HTTP version)
Headers(Host、ContentType、ContentLength …)body(内容的拼接格式/类型,依赖于Method、ContentType)
-
响应报文
状态行(HTTP version、status code、 status message)
Headers(ContentType、ContentLength …)body(内容类型和ContentType对应)
Reqeust Method
- GET (查询服务端资源,不发送body,具有幂等性)
- POST (增加/修改服务端资源,发送body)
- PUT (修改服务端资源,发送body,具有幂等性)
- DELETE(删除服务端资源,类似GET)
- HEAD (类似GET,响应无body)
Response status code
三位数字组成
- 1XX(临时性的消息,矫正性的工作, 100、101)
- 2XX(成功,200)
- 3XX(重定向,301、302)
- 4XX(客户端请求错误,400、401、403、404)
- 5XX(服务端响应错误,500)
Content-Type 常见类型
-
x-www-form-urlencode
主要用于Request报文中
body:
name=wxsmile&gender=male&age=17
-
multipart/form-data
主要用于Request报文中
Content-Type: multipart/form-data; boundary=------7M4A4YZTr0z
body:
------7M4A4YZTr0z Content-Disposition: form-data; name="name" Content-Type: text/plain wxsmile ------7M4A4YZTr0z Content-Disposition: form-data; name="avatar"; filename="avatar.jpg" Content-Type: image/jpeg JFIFHYUHHJOwrtYWwaA... ------7M4A4YZTr0z
-
text/html
body为html文本
<!DOCTYPE html> <html> ... </html>
-
text/plain
body为普通文本
wxsmile
-
application/json
Content-Type: application/json; charset=utf-8
body为json文本
{"name":"wxsmile","gender":"maile","age":"17"}
-
image/jpeg
body为二进制字符串
JFIFHYUHHJOwrtYWwaA...
Retrofit2与HTTP的关系
Retrofit其实是面向HTTP中的Content-Type以及body做封装,不管是Request还是Response。
使用HTTP协议交换数据都需要一个HttpClient,而Retrofit中的HttpClient是 Library OkHttp
OkHttp
OkHttp is an HTTP client
用Android中常见文件上传举例
如上所述,Retrofit 为 Content-Type:multipart/form-data
做了封装。
方式1:
@POST("users/image")
Call<String> uploadFileWithRequestBody(@Body MultipartBody multipartBody);
方式2:
@Multipart
@POST("users/image")
Call<String> uploadFilesWithParts(@Part() List<MultipartBody.Part> parts);
其实2种方式殊途同归,粒度不一样,一种是将body中------7M4A4YZTr0z
分隔符隔开的每一个内容为一个Part,一种是body作为一个整体。
但是最终都是指向RequestBody这个接口,RequestBody面向body,这里的实现是MultipartBody。
再举个例子,常见的给所有Http请求中添加公共参数
每一个请求的Method是不一致的,Content-Type也是不一致的,其body也不一致!
所以需要针对不同的情况,去添加公共数据。
思路很清晰,就偷偷懒就不再贴代码了,这个博主的文章已经写的很好很全了。
详见: 给HTTP请求添加公共参数-赖床的猫