【Hencoder Plus 学习笔记】 Http相关

573 阅读6分钟

HTTP 相关

1.HTTP到底是什么?

2.HTTP工作方式是怎样的?

3.URL 和 HTTP 报⽂

4.RequestMethod请求方法有哪些?

5.Status Code 状态码

6.Header ⾸部

7.其他 Headers

8.Cache缓存

9.REST

1.HTTP到底是什么呢?

1.1、两种直观的印象;

  • 1.浏览器输入地址,回车打开网页
  • 2.Android中发送网络请求,返回对应内容

1.2、HyperText Transfer Protocol超文本传输协议;

  • 超文本:在电脑中显示的,含有可以指向其他文本的链接文本
  • 超文本传输协议(英语:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是万维网的数据通信的基础。(设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。通过HTTP或者HTTPS协议请求的资源由统一资源标识符(Uniform Resource Identifiers,URI)来标识。)

2.HTTP工作方式是怎样的?

通常,由客户端发起一个请求,创建一个到服务器指定端口(默认是80)的TCP链接,服务器则在这个端口监听客户端的请求,当接收到请求后,会根据客户端的请求,返回对应的内容,比如html文本,图片之类的,并且返回对应的状态码来告诉客户端请求的状态是否成功;

3.URL 和 HTTP 报⽂?

3.1、 URL格式

  • 三部分:协议类型、服务器地址(和端⼝号)、路径(Path)
  • 协议类型://服务器地址[:端⼝号]路径 :hencoder.com/users?gende…

3.2、 报文格式

  • 请求报文
  • 响应报文

4.RequestMethod请求方法

HTTP请求的方法有:

  • GET:使用GET的请求用于从服务器获取数据;
  • HEAD:和GET请求相似,但是没有响应体;
  • POST:用于将内容提交到服务器,通常用于修改或者删除服务器上的资源;
  • PUT:通常用于修改服务器上的数据;
  • DELETE:删除服务器指定的资源;
  • CONNECT:建立一个到由目标资源标识的服务器的隧道,用于代理服务器;
  • OPTIONS:用于描述目标资源的通信选项,通常用于跨域请求;
  • TRACE:沿着到目标资源的路径执行一个消息环回测试,用于追踪请求;

GET方法:

  • ⽤于获取资源
  • 对服务器数据不进⾏修改
  • 不发送 Body
GET /users/1 HTTP/1.1
Host: api.github.com

对应 Retrofit 的代码:
@GET("/users/{id}")
Call<User> getUser(@Path("id") String id,@Query("gender") String gender);

POST方法:

  • ⽤于增加或修改资源
  • 发送给服务器的内容写在 Body ⾥⾯
POST /users HTTP/1.1
Host: api.github.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 13
name=rengwuxian&gender=male

对应 Retrofit 的代码:
@FormUrlEncoded
@POST("/users")
Call<User> addUser(@Field("name") String name,
@Field("gender") String gender);

PUT方法:

  • ⽤于修改资源
  • 发送给服务器的内容写在 Body ⾥⾯
PUT /users/1 HTTP/1.1
Host: api.github.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 13
gender=female

对应 Retrofit 的代码:
@FormUrlEncoded
@PUT("/users/{id}")
Call<User> updateGender(@Path("id") String id,
@Field("gender") String gender);

DELETE方法:

  • ⽤于删除资源
  • 不发送 Body
DELETE /users/1 HTTP/1.1
Host: api.github.com

对应 Retrofit 的代码:
@DELETE("/users/{id}")
Call<User> getUser(@Path("id") String id,
@Query("gender") String gender);

HEAD方法:

  • 和 GET 使⽤⽅法完全相同

  • 和 GET 唯⼀区别在于,返回的响应中没有 Body

5.Status Code 状态码

三位数字,⽤于对响应结果做出类型化描述(如“获取成功” “内容未找到”):

  • 1xx:临时性消息。如:100 (继续发送)、101(正在切换协议)
  • 2xx:成功。最典型的是 200(OK)、201(创建成功)。
  • 3xx:重定向。如 301(永久移动)、302(暂时移动)、304(内容未变)。
  • 4xx:客户端错误。如 400(客户端请求错误)、401(认证失败)、403(被禁⽌)、404(找不到内容)。
  • 5xx:服务器错误。如 500(服务器内部错误)。

6.Header ⾸部

作⽤:HTTP 消息的 metadata。

  • Host
    ⽬标主机。注意:不是在⽹络上⽤于寻址的,⽽是在⽬标服务器上⽤于定位⼦服务器的。
    
  • Content-Type:指定 Body 的类型。主要有四类:
    1. text/html
    请求 Web ⻚⾯是返回响应的类型,Body 中返回 html ⽂本。
    格式如下:
    HTTP/1.1 200 OK
    Content-Type: text/html; charset=utf-8
    Content-Length: 853
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    ......
    2. x-www-form-urlencoded
    Web ⻚⾯纯⽂本表单的提交⽅式。
    POST /users HTTP/1.1
    Host: api.github.com
    Content-Type: application/x-www-form-urlencoded
    Content-Length: 27
    name=rengwuxian&gender=male
    对应 Retrofit 的代码:
    @FormUrlEncoded
    @POST("/users")
    Call<User> addUser(@Field("name") String name,
    @Field("gender") String gender);
    
    3. multipart/form-data
    Web ⻚⾯含有⼆进制⽂件时的提交⽅式。
    POST /users HTTP/1.1
    Host: hencoder.com
    Content-Type: multipart/form-data; boundary=----
    WebKitFormBoundary7MA4YWxkTrZu0gW
    Content-Length: 2382
    ------WebKitFormBoundary7MA4YWxkTrZu0gW
    Content-Disposition: form-data; name="name"
    rengwuxian
    ------WebKitFormBoundary7MA4YWxkTrZu0gW
    Content-Disposition: form-data; name="avatar";
    filename="avatar.jpg"
    Content-Type: image/jpeg
    JFIFHHvOwX9jximQrWa......
    ------WebKitFormBoundary7MA4YWxkTrZu0gW--
    对应 Retrofit 的代码:
    @Multipart
    @POST("/users")
    Call<User> addUser(@Part("name") RequestBody name,
    @Part("avatar") RequestBody avatar);
    ...
    RequestBody namePart =
    RequestBody.create(MediaType.parse("text/plain"),
    nameStr);
    RequestBody avatarPart =
    RequestBody.create(MediaType.parse("image/jpeg"),
    avatarFile);
    api.addUser(namePart, avatarPart);
    
    4. application/json , image/jpeg , application/zip ...
    单项内容(⽂本或⾮⽂本都可以),⽤于 Web Api 的响应或者 POST / PUT 的请求
    请求中提交 JSON
    POST /users HTTP/1.1
    Host: hencoder.com
    Content-Type: application/json; charset=utf-8
    Content-Length: 38
    {"name":"rengwuxian","gender":"male"}
    对应 Retrofit 的代码:
    @POST("/users")
    Call<User> addUser(@Body("user") User user);
    ...
    // 需要使⽤ JSON 相关的 Converter
    api.addUser(user);
    响应中返回 JSON
    HTTP/1.1 200 OK
    content-type: application/json; charset=utf-8
    content-length: 234
    [{"login":"mojombo","id":1,"node_id":"MDQ6VXNl
    cjE=","avatar_url":"https://avatars0.githubuse
    rcontent.com/u/1?v=4","gravat......
    请求中提交⼆进制内容
    POST /user/1/avatar HTTP/1.1
    Host: hencoder.com
    Content-Type: image/jpeg
    Content-Length: 1575
    JFIFHH9......
    对应 Retrofit 的代码:
    @POST("users/{id}/avatar")
    Call<User> updateAvatar(@Path("id") String id, @Body
    RequestBody avatar);
    ...
    RequestBody avatarBody =
    RequestBody.create(MediaType.parse("image/jpeg"),
    avatarFile);
    api.updateAvatar(id, avatarBody)
    相应中返回⼆进制内容
    HTTP/1.1 200 OK
    content-type: image/jpeg
    content-length: 1575
    JFIFHH9......
    
  • Content-Length:指定 Body 的⻓度(字节)
  • Transfer: chunked (分块传输编码 Chunked Transfer Encoding):指定 Body 的⻓度(字节)⽤于当响应发起时,内容⻓度还没能确定的情况下。和 Content-Length 不同时使⽤。⽤途是尽早给出响应,减少⽤户等待。
    HTTP/1.1 200 OK
    Content-Type: text/html
    Transfer-Encoding: chunked
    4
    Chun
    9
    ked Trans
    12
    fer Encoding
    0
    
  • Location :指定重定向的⽬标 URL
  • User-Agent :⽤户代理,即是谁实际发送请求、接受响应的,例如⼿机浏览器、某款⼿机 App。
  • Range / Accept-Range :按范围取数据
    Accept-Range: bytes 响应报⽂中出现,表示服务器⽀持按字节来取范围数据
    Range: bytes=<start>-<end> 请求报⽂中出现,表示要取哪段数据
    Content-Range:<start>-<end>/total 响应报⽂中出现,表示发送的是哪段
    数据
    作⽤:断点续传、多线程下载。
    

7.其他 Headers

  • Accept: 客户端能接受的数据类型。如 text/html
  • Accept-Charset: 客户端接受的字符集。如 utf-8
  • Accept-Encoding: 客户端接受的压缩编码类型。如 gzip
  • Content-Encoding:压缩类型。如 gzip

8.Cache

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

9.REST

REST 的定义众说纷纭,没有统⼀答案。
扔物线的观点:REST HTTP 即正确使⽤ HTTP。包括:
使⽤资源的格式来定义 URL
规范地使⽤ method 来定义⽹络请求操作
规范地使⽤ status code 来表示响应状态
其他符合 HTTP 规范的设计准则