北京互联网公司名单,如何给网站做seo优化,苏州政策查询防疫,食品网站建设规划文章目录 学习资源来自#xff1a;扔物线HTTPHTTP到底是什么HTTP的工作方式URL -HTTP报文List itemHTTP的工作方式请求报文格式#xff1a;Request响应报文格式#xff1a;ResponseHTTP的请求方法状态码 HeaderHostContent-TypeContent-LengthTransfer: chunked (分块传… 文章目录 学习资源来自扔物线HTTPHTTP到底是什么HTTP的工作方式URL -HTTP报文List itemHTTP的工作方式请求报文格式Request响应报文格式ResponseHTTP的请求方法状态码 HeaderHostContent-TypeContent-LengthTransfer: chunked (分块传输编码 ChunkedTransfer Encoding)LocationUser-AgentRange / Accept-Range其他 HeadersCacheREST 课后题 学习资源来自扔物线
HTTP
HTTP到底是什么
两种直观印象 浏览器地址输入地址打开网页Android中发送网络请求返回对应内容 Hyper Text Transfer Protocol超文本传输协议 超文本在电脑中显示的、含有可以指向其他文本的链接的文本 ——HTML
HTTP的工作方式 #mermaid-svg-oYhKIBCEEozKF1qQ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-oYhKIBCEEozKF1qQ .error-icon{fill:#552222;}#mermaid-svg-oYhKIBCEEozKF1qQ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-oYhKIBCEEozKF1qQ .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-oYhKIBCEEozKF1qQ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-oYhKIBCEEozKF1qQ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-oYhKIBCEEozKF1qQ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-oYhKIBCEEozKF1qQ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-oYhKIBCEEozKF1qQ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-oYhKIBCEEozKF1qQ .marker.cross{stroke:#333333;}#mermaid-svg-oYhKIBCEEozKF1qQ svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-oYhKIBCEEozKF1qQ .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-oYhKIBCEEozKF1qQ .cluster-label text{fill:#333;}#mermaid-svg-oYhKIBCEEozKF1qQ .cluster-label span{color:#333;}#mermaid-svg-oYhKIBCEEozKF1qQ .label text,#mermaid-svg-oYhKIBCEEozKF1qQ span{fill:#333;color:#333;}#mermaid-svg-oYhKIBCEEozKF1qQ .node rect,#mermaid-svg-oYhKIBCEEozKF1qQ .node circle,#mermaid-svg-oYhKIBCEEozKF1qQ .node ellipse,#mermaid-svg-oYhKIBCEEozKF1qQ .node polygon,#mermaid-svg-oYhKIBCEEozKF1qQ .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-oYhKIBCEEozKF1qQ .node .label{text-align:center;}#mermaid-svg-oYhKIBCEEozKF1qQ .node.clickable{cursor:pointer;}#mermaid-svg-oYhKIBCEEozKF1qQ .arrowheadPath{fill:#333333;}#mermaid-svg-oYhKIBCEEozKF1qQ .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-oYhKIBCEEozKF1qQ .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-oYhKIBCEEozKF1qQ .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-oYhKIBCEEozKF1qQ .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-oYhKIBCEEozKF1qQ .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-oYhKIBCEEozKF1qQ .cluster text{fill:#333;}#mermaid-svg-oYhKIBCEEozKF1qQ .cluster span{color:#333;}#mermaid-svg-oYhKIBCEEozKF1qQ div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-oYhKIBCEEozKF1qQ :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 发送请求 响应 浏览器 服务器 URL -HTTP报文 List item
HTTP的工作方式 #mermaid-svg-g8FeEfrIxSEBbUZU {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-g8FeEfrIxSEBbUZU .error-icon{fill:#552222;}#mermaid-svg-g8FeEfrIxSEBbUZU .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-g8FeEfrIxSEBbUZU .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-g8FeEfrIxSEBbUZU .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-g8FeEfrIxSEBbUZU .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-g8FeEfrIxSEBbUZU .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-g8FeEfrIxSEBbUZU .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-g8FeEfrIxSEBbUZU .marker{fill:#333333;stroke:#333333;}#mermaid-svg-g8FeEfrIxSEBbUZU .marker.cross{stroke:#333333;}#mermaid-svg-g8FeEfrIxSEBbUZU svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-g8FeEfrIxSEBbUZU .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-g8FeEfrIxSEBbUZU .cluster-label text{fill:#333;}#mermaid-svg-g8FeEfrIxSEBbUZU .cluster-label span{color:#333;}#mermaid-svg-g8FeEfrIxSEBbUZU .label text,#mermaid-svg-g8FeEfrIxSEBbUZU span{fill:#333;color:#333;}#mermaid-svg-g8FeEfrIxSEBbUZU .node rect,#mermaid-svg-g8FeEfrIxSEBbUZU .node circle,#mermaid-svg-g8FeEfrIxSEBbUZU .node ellipse,#mermaid-svg-g8FeEfrIxSEBbUZU .node polygon,#mermaid-svg-g8FeEfrIxSEBbUZU .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-g8FeEfrIxSEBbUZU .node .label{text-align:center;}#mermaid-svg-g8FeEfrIxSEBbUZU .node.clickable{cursor:pointer;}#mermaid-svg-g8FeEfrIxSEBbUZU .arrowheadPath{fill:#333333;}#mermaid-svg-g8FeEfrIxSEBbUZU .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-g8FeEfrIxSEBbUZU .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-g8FeEfrIxSEBbUZU .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-g8FeEfrIxSEBbUZU .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-g8FeEfrIxSEBbUZU .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-g8FeEfrIxSEBbUZU .cluster text{fill:#333;}#mermaid-svg-g8FeEfrIxSEBbUZU .cluster span{color:#333;}#mermaid-svg-g8FeEfrIxSEBbUZU div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-g8FeEfrIxSEBbUZU :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 发送请求 响应 APP 服务器 请求报文格式Request 响应报文格式Response HTTP的请求方法
GET 获取资源没有body
GET /users/1 HTTP/1.1
Host: api.github.com对应Retrofit的代码
GET{/users/{id}}
CallUsergetUser(Path(id)String id)POST 增加或修改资源有body
POST /users HTTP/1.1
Host: api.github.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 13namerengwuxiangendermale对应Retrofit的代码
FormUrlEncoded //请求的编码方式为表单编码
POST(/users)
CallUser addUser(Field(name) String name,
Field(gender) String gender);PUT 修改资源有body
POST /users HTTP/1.1
Host: api.github.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 13
namerengwuxiangendermale对应Retrofit的代码
FormUrlEncoded
PUT(/users/{id})
CallUser updateGender(Path(id) String id,
Field(gender) String gender);DELETE 删除资源没有body
POST /users HTTP/1.1
Host: api.github.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 13
namerengwuxiangendermale对应Retrofit的代码
DELETE(/users/{id})
CallUser getUser(Path(id) String id,
Query(gender) String gender);HEAD 和 GET 使用方法完全相同和 GET 唯一区别在于返回的响应中没有 Body
状态码
作用对结果做出类型化描述 1xx临时性消息。如100 继续发送、101正在切换协议2xx成功。最典型的是 200OK、201创建成功。3xx重定向。如 301永久移动、302暂时移动、304内容未改变。4xx客户端错误。如 400客户端请求错误、401认证失败、403被禁止、404找不到内容。5xx服务器错误。如 500服务器内部错误
Header
作用HTTP消息的元数据metadata
Host
目标主机地址
Content-Type
指定 Body 的类型。主要有四类
text/html HTML文本用于浏览器页面响应
请求 Web ⻚面是返回响应的类型Body 中返回 html 文本。格式如下
HTTP/1.1 200 OK
Content-Type: text/html; charsetutf-8
Content-Length: 853
!DOCTYPE html
html
head
meta charsetutf-8
......x-www-form-urlencoded 普通表单。encodeed URL格式 Web ⻚面纯文本表单的提交方式。 格式如下
POST /users HTTP/1.1
Host: api.github.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 27namerengwuxiangendermale对应Retrofit的代码
FormUrlEncoded //请求的编码方式为表单编码
POST(/users)
CallUser addUser(Field(name) String name,
Field(gender) String gender);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; namenamerengwuxian
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; nameavatar;
filenameavatar.jpg
Content-Type: image/jpegJFIFHHvOwX9jximQrWa......
------WebKitFormBoundary7MA4YWxkTrZu0gW--对应Retrofit的代码
Multipart
POST(/users)
CallUser 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 , image/jpeg , application/zip … JSON形式用于Web Api的响应或POST/PUT的请求 单项内容文本或非文本都可以用于 Web Api 的响应或者 POST / PUT 的请求
请求中提交 JSON
POST /users HTTP/1.1
Host: hencoder.com
Content-Type: application/json; charsetutf-8
Content-Length: 38{name:rengwuxian,gender:male}对应Retrofit的代码
POST(/users)
CallUser addUser(Body(user) User user);
...
// 需要使用 JSON 相关的 Converter
api.addUser(user);响应中返回JSON
HTTP/1.1 200 OK
content-type: application/json; charsetutf-8
content-length: 234
[{login:mojombo,id:1,node_id:MDQ6VXNl
cjE,avatar_url:https://avatars0.githubuse
rcontent.com/u/1?v4,gravat......请求中提交二进制内容
POST /user/1/avatar HTTP/1.1
Host: hencoder.com
Content-Type: image/jpeg
Content-Length: 1575JFIFHH9......对应Retrofit的代码
POST(users/{id}/avatar)
CallUser 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: 1575JFIFHH9......image/jpeg/application/zip 单文件用于Web Api响应或POST/PUT请求
Content-Length
指定 Body 的⻓度字节。
Transfer: chunked (分块传输编码 ChunkedTransfer Encoding)
用于当响应发起时内容⻓度还没能确定的情况下。和 Content-Length 不同时使用。用途是尽早给出响应减少用户等待。 格式
HTTP/1.1 200 OK
Content-Type: text/html
Transfer-Encoding: chunked4
Chun
9
ked Trans
12
fer Encoding
0Location
指定重定向的目标 URL
User-Agent
用户代理客户端即是谁实际发送请求、接受响应的例如手机浏览器、某款手机 App。
Range / Accept-Range
指定body的内容范围 按范围取数据 Accept-Range: bytes 响应报文中出现表示服务器支持按字节来取范围数据 Range: bytesstart-end 请求报文中出现表示要取哪段数据 Content-Range:start-end/total 响应报文中出现表示发送的是哪段 数据 作用断点续传、多线程下载。
其他 Headers
Accept: 客户端能接受的数据类型。如 text/htmlAccept-Charset: 客户端接受的字符集。如 utf-8Accept-Encoding: 客户端接受的压缩编码类型。如 gzipContent-Encoding压缩类型。如 gzip
Cache
作用在客户端或中间网络节点缓存数据降低从服务器取数据的频率以提高网络性能。
REST
REST 的定义众说纷纭没有统一答案。 扔物线的观点REST HTTP 即正确使用 HTTP。包括
使用资源的格式来定义 URL规范地使用 method 来定义网络请求操作规范地使用 status code 来表示响应状态其他符合 HTTP 规范的设计准则
课后题
【单选题】用户在浏览器地址栏输入地址后回车一段时间后浏览器显示出页面这背后发生了什么 A. 浏览器拼装 HTTP 报文并向服务器请求 - 服务器处理请求并返回响应报文 - 浏览器接收到响应报文后处理并使用渲染引擎来渲染出界面 B. 浏览器把地址栏的 URL 发送给服务器 - 服务器把 URL 对对应的页面图片文件发回给浏览器 - 浏览器接收到图片后显示出来 答案: A 答案解析当用户在地址栏输入地址并回车时浏览器会通过 DNS 解析找到相应的服务器 IP 地址然后通过 TCP/IP 协议建立连接。一旦连接建立浏览器会根据地址栏中的 URL 拼装 HTTP 请求报文并向服务器发送请求。服务器接收到请求后会进行处理并返回 HTTP 响应报文。浏览器接收到响应报文后会进行解析和处理然后使用渲染引擎如 HTML、CSS 和 JavaScript来渲染出页面界面最终将页面显示在用户的屏幕上 【单选题】一个 URL 如 http://api.qq.com/user/1 中对于「HTTP 组装报文」来说可以拆成哪几部分 A. ① 【http:】- 协议类型 ② 【//api.qq.com/user/1】- 路径 B. ① 【http:】- 协议类型 ② 【//api.qq.com】- 服务器地址 ③ 【/user/1】- 路径 C. ① 【http:】- 协议类型 ② 【//api.qq.com/user/】- 路径 ③ 【1】- 文件名 答案: B 答案解析在HTTP组装报文中URL可以拆分成以下几部分 协议类型URL中的http:表示使用的协议类型这里是HTTP。服务器地址URL中的//api.qq.com表示请求的目标服务器地址。路径URL中的/user/1表示请求的路径。它通常指示了请求的资源位置或者资源的特定状态。文件名如果路径中包含文件名例如/user/1那么文件名就是路径的最后部分。但在给定的URL中并没有包含文件名。 所以根据这个URL “http://api.qq.com/user/1”我们可以拆分成以下部分 协议类型http: 服务器地址//api.qq.com 路径/user/1 因此答案是B 【单选题】HTTP 的请求报文分为哪几部分 A. 请求行、path、Headers、Body B. 请求行、Headers、Body C. 请求行、方法、Host、Body 答案: B 答案解析HTTP 请求报文通常分为以下几个部分 请求行Request Line包含请求方法如 GET、POST 等、请求的资源路径和 HTTP 协议的版本。Headers头部包含与请求相关的各种元数据例如请求的上下文、客户端的信息、服务器的信息等。Body主体包含请求的主体内容例如在 POST 或 PUT 请求中发送的数据。 所以正确答案是 B 【单选题】请求行由哪三部分组成 A. method、path、HTTP 版本 B. method、path、Host C. method、服务器地址、path 答案: A 答案解析请求行由请求方法、请求的资源路径和HTTP协议版本三部分组成。所以答案是A 【单选题】HTTP 的响应报文分为哪几部分 A. 响应头、响应码、响应信息 B. 状态行、响应头、Headers、Body C. 状态行、Headers、Body 答案: B 答案解析HTTP 的响应报文通常分为以下几个部分 状态行Status Line包含HTTP协议的版本、请求的状态码和相应的文字描述。Headers头部包含与响应相关的各种元数据例如响应的内容类型、响应的上下文、服务器的信息等。Body主体包含响应的主体内容即浏览器应该接收的数据。 所以正确答案是 B 【单选题】响应报文的状态行由哪三部分组成 A. HTTP 版本、API 版本、状态码 B. HTTP 版本、状态码、状态信息 C. HTTP 版本、Body 类型、状态码 答案: B 答案解析响应报文的状态行由HTTP版本、状态码和状态信息三部分组成。因此答案为B 【多选题】以下哪几项符合 GET 方法 A. 用于获取资源 B. 用于增加或修改资源 C. 仅用于修改资源 D. 用于删除资源 E. 幂等即反复调用多次时会得到相同的结果 F. 请求报文中包含 Body 答案: 答案解析 【多选题】以下哪几项符合 POST 方法 A. 用于获取资源 B. 用于增加或修改资源 C. 仅用于修改资源 D. 用于删除资源 E. 幂等即反复调用多次时会得到相同的结果 F. 请求报文中包含 Body 答案: A、E 答案解析GET 方法用于从服务器获取资源即请求指定的数据。它不可以用于增加、修改或删除资源。GET 方法是幂等的即反复调用多次时会得到相同的结果。另外GET 方法在请求报文中不包含 Body。因此符合 GET 方法的选项有A、E。 【多选题】以下哪几项符合 PUT 方法 A. 用于获取资源 B. 用于增加或修改资源 C. 仅用于修改资源 D. 用于删除资源 E. 幂等即反复调用多次时会得到相同的结果 F. 请求报文中包含 Body 答案: B、F 答案解析POST 方法用于向服务器增加或修改资源它可以在请求报文中包含 Body以发送数据给服务器。POST 方法不是幂等的即反复调用多次时可能得到不同的结果。因此符合 POST 方法的选项有B、F 【多选题】以下哪几项符合 DELETE 方法 A. 用于获取资源 B. 用于增加或修改资源 C. 仅用于修改资源 D. 用于删除资源 E. 幂等即反复调用多次时会得到相同的结果 F. 请求报文中包含 Body 答案: D、E 答案解析DELETE 方法用于从服务器删除资源它不用于获取、增加或修改资源。DELETE 方法是幂等的即反复调用多次时会得到相同的结果。另外DELETE 方法在请求报文中不包含 Body。因此符合 DELETE 方法的选项有D、E。 【单选题】Host 这个 Header 的作用是 A. 在网络上寻址目标主机的 IP并在找到目标主机后确认主机域名和端口 B. 仅用于寻址目标主机的 IP C. 仅用于找到目标主机后确认主机域名和端口 答案: A 答案解析Host是HTTP协议中的一个请求头字段它用于指定请求的主机名和端口号。在网络通信中需要通过IP地址来寻址目标主机而Host头字段的作用就是在找到目标主机后确认主机域名和端口。因此答案为A 【单选题】Content-Type 为 x-www-form-urlencoded 时请求报文中 Body 的格式为以下哪种形式 A. Encoded URL即 name1value1name2value2 的形式 B. 分多个部分传输每部分内容的形式使用 boundary 对它们进行分隔 C. JSON 形式如 {“name1”:value1,“name2”:value2} 答案: A 答案解析在HTTP请求中当Content-Type为x-www-form-urlencoded时请求报文中的Body采用name1value1name2value2的形式即编码URL的形式以“”分隔不同的参数。因此答案为A 【单选题】Content-Type 为 multipart/form-data 时请求报文中 Body 的格式为以下哪种形式 A. Encoded URL即 name1value1name2value2 的形式 B. 分多个部分传输每部分内容的形式使用 boundary 对它们进行分隔 C. JSON 形式如 {“name1”:value1,“name2”:value2} 答案: B 答案解析在HTTP请求中当Content-Type为multipart/form-data时请求报文中的Body采用分多个部分传输每部分内容的形式使用boundary对它们进行分隔。每个部分都有自己的Content-Type和Content-Disposition头字段用于描述该部分的内容类型和用途。因此答案为B 【单选题】Content-Type 为 application/json 时请求报文中 Body 的格式为以下哪种形式 A. Encoded URL即 name1value1name2value2 的形式 B. 分多个部分传输每部分内容的形式使用 boundary 对它们进行分隔 C. JSON 形式如 {“name1”:value1,“name2”:value2} 答案: C 答案解析当Content-Type为application/json时请求报文中的Body采用JSON格式即以大括号{}包裹一个对象对象由多个键值对组成每个键值对之间使用冒号:分隔不同的键值对之间使用逗号,分隔。因此答案为C 【单选题】Android 开发者写的 HTTP 代码是怎么工作的 A. Android 系统把开发者写入的 URL 发送给服务器服务器处理后把开发者需要的数据直接返回给客户端然后开发者的的回调代码对数据进行处理 B. Android 代码把开发者写入的 URL 和其他请求信息拼装成 HTTP 报文以报文形式给服务器发送 HTTP 请求服务器处理请求后返回标准 HTTP 报文客户端处理报文后得到真正的数据然后开发者的回调代码对输出进行处理 答案: B 答案解析Android 开发者写的 HTTP 代码主要是通过使用HttpURLConnection、HttpClient、OkHttp 等类库将开发者写入的 URL 和其他请求信息拼装成 HTTP 报文以报文形式给服务器发送 HTTP 请求。服务器处理请求后返回标准的 HTTP 报文客户端接收到报文后需要对其进行解析和处理以得到真正的数据。最后开发者的回调代码对输出进行处理。因此选项 B 是正确的