美文网首页
HTTP的原理和工作机制

HTTP的原理和工作机制

作者: angeliur | 来源:发表于2019-08-04 09:29 被阅读0次
    HTTP 的定义

    一种网络传输协议,位于 TCP / IP 协议族的最顶层——应用层
    HTTP : Hypertext Transfer Protocol,超文本传输协议,和 HTML (Hypertext Markup Language 超文本标记语言) 一起诞生,用于在网络上请求和传输 HTML 内容。
    超文本,即「扩展型文本」,指的是 HTML 中可以有链向别的文本的链接(hyperlink)。

    HTTP的工作方式
    http工作方式.png

    浏览器:

    用户输入地址后回车或点击链接 -> 浏览器器拼装 HTTP 报文并发送请求给服务器器 -> 服务器器处理理请求后发送响应报文给浏览器器 -> 浏览器器解析响应报文并使用渲染引擎显示到界⾯面

    手机 App:

    用户点击或界面自动触发联网需求 -> Android 代码调用拼装 HTTP 报文并发送请求到服务器器 -> 服务器器处理理请求后发送响应报文给手机 -> Android 代码处理理响应报文并作出相应处理理(如储存数据、加工数据、显示数据到界面)

    URL和 http报文
    1. URL

      三部分:协议类型、服务器器地址(和端口号)、路径(Path)

      协议类型://服务器器地址[:端口号]路径

      http://hencoder.com/users?gender=male

      URL.png
    1. 报文格式

      • Request 请求报文

        Request报文格式.png
    • Response 响应报文

      Response报文格式.png

    Request Method 请求方法
    • 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

    GET和PUT是幂等的,无论请求或者修改多少次结果都是一样的。DELETE也具有幂等性,删除一次和删除多次结果都是删除了。

    STATUS CODE 状态码 : 三位数字,用于对响应结果做出类型化描述(如获取成功、内容未找到)
    • 1xx:临时性消息。如:100 (继续发送)、101(正在切换协议)
    • 2xx:成功。最典型的是 200(OK)、201(创建成功)。
    • 3xx:重定向。如 301(永久移动)、302(暂时移动)、304(内容未改变)。
    • 4xx:客户端错误。如 400(客户端请求错误)、401(认证失败)、403(被禁⽌止)、404(找

    不不到内容)。

    • 5xx:服务器器错误。如 500(服务器器内部错误)。
    HEADER首部

    作用:HTTP 消息的 metadata(元数据),metadata就是数据的数据或者数据的属性

    • Host : 服务器主机地址,一般是域名 + tcp端口

      注意:不是在网络上用于寻址的,而是在目标服务器器上用于定位子服务器的。寻址是通过DNS系统来定位IP地址的

    • Content-Length : 指定 Body 的长度(字节)

    • Content-Type : 指定 Body 的类型。主要有四类:

      • text/html : 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">
        ......
        
      • x-www-form-urlencoded : Web 页面纯文本表单的提交方式。普通表单,encoded URL格式,只能传文本,不能传二进制数据

        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);
        
      • multitype/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);
        
      • application/json : json形式,用于 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......
        
      • image/jpeg application/zip ... : 单文件,用于 Web Api 的响应或者 POST / PUT 的请求。比如单个文件上传可以直接通过image/jpge的type类型来上传,而不是必须要用multitype/form-data类型。

    • Transfer: chunked (分块传输编码 Chunked Transfer Encoding)

      用于当响应发起时,内容长度还没能确定的情况下,需要将响应内容分块传输。和 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 : 指定body的内容范围

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

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

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

    cache和buffer的区别:cache是请求过的数据,为了防止下次需要再次访问将数据做缓存。buffer是对于确定的要访问的数据,提前准备好,当需要的时候可以快速获取。

    REST

    REST HTTP 即正确使用 HTTP。包括:

    • 使用资源的格式来定义 URL
    • 规范地使用 method 来定义网络请求操作
    • 规范地使用 status code 来表示响应状态
    • 其他符合 HTTP 规范的设计准则

    相关文章

      网友评论

          本文标题:HTTP的原理和工作机制

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