理解超文本传输协议

概念

传输超文本的网络协议。
超文本: 扩展型(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文本

      
      
      	...  
      
    
  • 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 uploadFileWithRequestBody(@Body MultipartBody multipartBody);

方式2:

@Multipart
@POST("users/image")
Call uploadFilesWithParts(@Part() List parts);

其实2种方式殊途同归,粒度不一样,一种是将body中------7M4A4YZTr0z分隔符隔开的每一个内容为一个Part,一种是body作为一个整体。

但是最终都是指向RequestBody这个接口,RequestBody面向body,这里的实现是MultipartBody。

再举个例子,常见的给所有Http请求中添加公共参数

每一个请求的Method是不一致的,Content-Type也是不一致的,其body也不一致!

所以需要针对不同的情况,去添加公共数据。

思路很清晰,就偷偷懒就不再贴代码了,这个博主的文章已经写的很好很全了。
详见: 给HTTP请求添加公共参数-赖床的猫

你可能感兴趣的:(Other)