超文本:即「扩展型文本」,指 HTML 中可以有链向别的文本的链接(hyperlink)。
HTTP协议:Hypertext Transfer Protocol,超文本传输协议,和 HTML (Hypertext Markup Language 超文本标记语言) 一起诞生,用于在网络上请求和传输 HTML 内容。
用户输入地址后回⻋或点击链接 -> 浏览器拼装 HTTP 报文并发送请求给服务器 -> 服务器处理请求后发送响应报文给浏览器 -> 浏览器解析响应报文并使用渲染引擎显示到界面
以Android为例:用户点击或界面自动触发联网需求 -> Android 代码调用拼装 HTTP 报文并发送请求到服务器 -> 服务器处理请求后发送响应报文给手机 -> Android 代码处理响应报文并作出相应处理(如储存数据、加工数据、显示数据到界面)
代理(Proxies)
在浏览器和服务器之间,有许多计算机和其他设备转发了HTTP消息,它们大多都出现在传输层、网络层和物理层上,对于HTTP应用层而言就是透明的。还有一部分是表现在应用层上的,被称为代理(Proxies)。代理主要有如下几种作用:
三部分:协议类型、服务器地址(和端口号)、路径(Path)
协议类型://服务器地址[:端口号]路径:/
请求方法包括:POST、GET、HEAD、PUT、POST、TRACE、OPTIONS、DELETE等
协议版本:HTTP/版本号:HTTP/1.0,HTTP/1.1,HTTP/2.0
HTTP request methods 一共九种,主要介绍四种最常用方法。
报文格式:
GET /users/1 HTTP/1.1 Host: api.github
Retrofit 代码:
@GET("/users/{id}")
Call<User> getUser(@Path("id") String id, @Query("gender") String gender);
报文格式:
POST /users HTTP/1.1
Host: api.github Content-Type: application/x-www-form-urlencoded
Content-Length: 22name=lucas&gender=male
Retrofit 代码:
@FormUrlEncoded
@POST("/users")
Call<User> addUser(@Field("name") String name, @Field("gender") String gender);
报文格式:
PUT /users/1 HTTP/1.1
Host: api.github
Content-Type: application/x-www-form-urlencoded
Content-Length: 13gender=female
Retrofit 代码:
@FormUrlEncoded
@PUT("/users/{id}")
Call<User> updateGender(@Path("id") String id, @Field("gender") String gender);
报文格式:
DELETE /users/1 HTTP/1.1
Host: api.github
对Retrofit 代码:
@DELETE("/users/{id}")
Call<User> getUser(@Path("id") String id, @Query("gender") String gender);
HTTP response status codes为三位数字,用于对响应结果做出类型化描述(如「获取成功」「内容未找到」)。
1xx:临时性消息。如: 100 (继续发送)、 101 (正在切换协议)
2xx:成功。最典型的是 200 (OK)、 201 (创建成功)。
3xx:重定向。如 301 (永久移动)、 302 (暂时移动)、 304 (内容未改变)。
4xx:客户端错误。如 400 (客户端请求错误)、 401 (认证失败)、 403 (被禁止)、 404 (找不到内容)。
5xx:服务器错误。如 500 (服务器内部错误)。
HTTP Headers是HTTP 消息的 metadata信息。允许客户端和服务器通过 request和 response传递附加信息。
Host: <host>:<port>
指明请求将要发送到的服务器主机名和端口号。注意:不是在网络上用于寻址的,而是在目标服务器上用于定位子服务器的。
在响应中,Content-Type标头告诉客户端实际返回的内容的内容类型。主要有四类:
请求 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"> ......
Web ⻚面纯文本表单的提交方式。
格式如下:
POST /users HTTP/1.1
Host: api.github
Content-Type: application/x-www-form-urlencoded
Content-Length: 27name=lucas&gender=male
对应 Retrofit 的代码:
@FormUrlEncoded
@POST("/users")
Call<User> addUser(@Field("name") String name, @Field("gender") String gender);
Web ⻚面含有二进制文件时的提交方式。
格式如下:
POST /users HTTP/1.1
Host: github
Content-Type: multipart/form-data; boundary=---WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Length: 2382------WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data; id="id"lucas------WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data; name="avatar"; filename="avatar.jpg" Content-Type: ------WebKitFormBoundary7MA4YWxkTrZu0gW--
对应 Retrofit 的代码:
@Multipart
@POST("/users")
Call<User> addUser(@Part("name") RequestBody name, @Part("avatar") RequestBody avatar);...RequestBody namePart = ate(MediaType.parse("text/plain"), nameStr);
RequestBody avatarPart = ate(MediaType.parse("image/jpeg"), avatarFile); api.addUser(namePart, avatarPart);
单项内容(文本或非文本都可以),用于 Web Api 的响应或者 POST / PUT 的请求
请求中提交 JSON
POST /users HTTP/1.1
Host: github
Content-Type: application/json; charset=utf-8
Content-Length: 38{"name":"lucas","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":" rcontent/u/1?v=4",
请求中提交二进制内容
POST /user/1/avatar HTTP/1.1
Host: hencoder
Content-Type: image/jpeg
Content-Length:
对应 Retrofit 的代码:
@POST("users/{id}/avatar")
Call<User> updateAvatar(@Path("id") String id, @Body RequestBody avatar);...RequestBody avatarBody = ate(MediaType.parse("image/jpeg"), avatarFile); api.updateAvatar(id, avatarBody)
相应中返回二进制内容
HTTP/1.1 200 OK
content-type: image/jpeg
content-length:
指定 Body 的⻓度(字节)。
Transfer: chunked (分块传输编码 Chunked Transfer Encoding)
用于当响应发起时,内容⻓度还没能确定的情况下。和 Content-Length 不同时使用。用途是尽早给出响应,减少用户等待。
格式:
HTTP/1.1 200 OK
Content-Type: text/html
Transfer-Encoding: chunked4 Chun 9 ked Trans 12 fer Encoding 0
指定重定向的目标 URL,一般在响应码为3xx的响应中才会有意义。
用户代理,即是谁实际发送请求、接受响应的,例如手机浏览器、某款手机 App。
按范围取数据
Accept-Range: bytes 响应报文中出现,表示服务器支持按字节来取范围数据
Range: bytes=- 请求报文中出现,表示要取哪段数据
Content-Range:-/total 响应报文中出现,表示发送的是哪段数据
作用:断点续传、多线程下载。
REST HTTP 即正确使用 HTTP。包括:
这些知识点了解即可,请自查自学
WSS
SPEDY
websocket、http协议区别
何为长链接/短连接
http/websocket、socket、tcp/ip的关系和区别
(网上很多文章提到:socket是长链接,这是个错误说法,socket是tcp/ip面向程序员开发的抽象)
本文发布于:2024-01-28 08:51:35,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/17064031036241.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |