即使没能写出OkHttp,也请务必知道的Http知识!

2024-01-20 20:10

本文主要是介绍即使没能写出OkHttp,也请务必知道的Http知识!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 1 HTTP 概念/定义
  • 2 TCP/IP协议族体系结构以及主要协议
  • 3 HTTP 的工作机制/原理
    • B-S:
    • C-S:
  • 4 代理(Proxies)
  • 5 HTTP基本性质:
  • 6 URL 和 HTTP 报文
    • URL 格式
    • 请求报文格式:
    • 响应报文格式:
  • 7 Request Method 请求方法
    • 1 GET
    • 2 POST
    • 3 PUT
    • 4 DELETE
  • 8 Status Code 状态码
  • 9 Header
    • Host
    • Content-Type
      • 1. text/html
      • 2. x-www-form-urlencoded
      • 3. multipart/form-data
      • 4. application/json , image/jpeg , application/zip ...
    • Content-Length
    • Transfer: chunked
    • Location
    • User-Agent
    • Range / Accept-Range
    • 其他 Headers
  • 10 REST
  • 补充:引申知识点自查

1 HTTP 概念/定义

超文本:即「扩展型文本」,指 HTML 中可以有链向别的文本的链接(hyperlink)。

HTTP协议:Hypertext Transfer Protocol,超文本传输协议,和 HTML (Hypertext Markup Language 超文本标记语言) 一起诞生,用于在网络上请求和传输 HTML 内容。

2 TCP/IP协议族体系结构以及主要协议

3 HTTP 的工作机制/原理

B-S:

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

C-S:

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

4 代理(Proxies)

代理(Proxies)

在浏览器和服务器之间,有许多计算机和其他设备转发了HTTP消息,它们大多都出现在传输层、网络层和物理层上,对于HTTP应用层而言就是透明的。还有一部分是表现在应用层上的,被称为代理(Proxies)。代理主要有如下几种作用:

  • 缓存(可以是公开的也可以是私有的,像浏览器的缓存)
  • 过滤(像反病毒扫描,家长控制…)
  • 负载均衡(让多个服务器服务不同的请求)
  • 认证(对不同资源进行权限管理)
  • 日志记录(允许存储历史信息)
  • 网络管制(所有局部请求全部通过管制代理服务器进行收发)
  • 突破限制(将请求给另外一台具有访问权限的服务器进行访问再转回给自己)

5 HTTP基本性质:

  • HTTP是简单可扩展的:HTTP简单易读,允许简单测试,对新人友好。在 HTTP/1.0 中出现的 HTTP headers 让协议扩展变得非常容易。只要服务端和客户端就新 headers 达成语义一致,新功能就可以被轻松加进来。
  • HTTP是无连接:限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接以节省传输时间。
  • HTTP是媒体独立的:只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP(通过MIME-type内容类型)发送。
  • HTTP是无状态:对于事务处理没有记忆能力。坏处:每次连接传送的数据量增大,缺少状态意味着如果后续处理需要前面的信息就必须重传;好处:在服务器不需要先前信息时它的应答就较快。

6 URL 和 HTTP 报文

URL 格式

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

协议类型://服务器地址[:端口号]路径:https://github.com/LucasXu01/

请求报文格式:

请求方法包括:POST、GET、HEAD、PUT、POST、TRACE、OPTIONS、DELETE
协议版本:HTTP/版本号:HTTP/1.0,HTTP/1.1,HTTP/2.0

pic

响应报文格式:

pic

7 Request Method 请求方法

HTTP request methods 一共九种,主要介绍四种最常用方法。

1 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);

2 POST

  • 用于增加或修改资源
  • 有body,发送给服务器的内容写在 Body 里面

报文格式:

POST /users HTTP/1.1 
Host: api.github.com 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);

3 PUT

  • 用于修改资源
  • 发送给服务器的内容写在 Body 里面

报文格式:

PUT /users/1 HTTP/1.1
Host: api.github.com 
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);

4 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);

8 Status Code 状态码

HTTP response status codes为三位数字,用于对响应结果做出类型化描述(如「获取成功」「内容未找到」)。

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

9 Header

HTTP Headers是HTTP 消息的 metadata信息。允许客户端和服务器通过 requestresponse传递附加信息。

Host

Host: <host>:<port>

指明请求将要发送到的服务器主机名和端口号。注意:不是在网络上用于寻址的,而是在目标服务器上用于定位子服务器的。

Content-Type

在响应中,Content-Type标头告诉客户端实际返回的内容的内容类型。主要有四类:

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 ⻚面纯文本表单的提交方式。

pic

格式如下:

POST /users HTTP/1.1 
Host: api.github.com 
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);

3. multipart/form-data

Web ⻚面含有二进制文件时的提交方式。

pic

格式如下:

POST /users HTTP/1.1 
Host: github.com 
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: image/jpegJlkfjafkjasifdFJAJfaJkj...... ------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: github.com 
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":"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: 1575JFIFHH9......

对应 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: 1575JFIFHH9......

Content-Length

指定 Body 的⻓度(字节)。

Transfer: chunked

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

Location

指定重定向的目标 URL,一般在响应码为3xx的响应中才会有意义。

User-Agent

用户代理,即是谁实际发送请求、接受响应的,例如手机浏览器、某款手机 App。

Range / Accept-Range

按范围取数据

Accept-Range: bytes 响应报文中出现,表示服务器支持按字节来取范围数据
Range: bytes=- 请求报文中出现,表示要取哪段数据
Content-Range:-/total 响应报文中出现,表示发送的是哪段数据

作用:断点续传、多线程下载。

其他 Headers

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

10 REST

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

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

补充:引申知识点自查

这些知识点了解即可,请自查自学

WSS

SPEDY

websocket、http协议区别

何为长链接/短连接

http/websocket、socket、tcp/ip的关系和区别

(网上很多文章提到:socket是长链接,这是个错误说法,socket是tcp/ip面向程序员开发的抽象)

这篇关于即使没能写出OkHttp,也请务必知道的Http知识!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/627188

相关文章

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

sqlite3 相关知识

WAL 模式 VS 回滚模式 特性WAL 模式回滚模式(Rollback Journal)定义使用写前日志来记录变更。使用回滚日志来记录事务的所有修改。特点更高的并发性和性能;支持多读者和单写者。支持安全的事务回滚,但并发性较低。性能写入性能更好,尤其是读多写少的场景。写操作会造成较大的性能开销,尤其是在事务开始时。写入流程数据首先写入 WAL 文件,然后才从 WAL 刷新到主数据库。数据在开始

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

BUUCTF靶场[web][极客大挑战 2019]Http、[HCTF 2018]admin

目录   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 [web][HCTF 2018]admin 考点:弱密码字典爆破 四种方法:   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 访问环境 老规矩,我们先查看源代码

【Linux】应用层http协议

一、HTTP协议 1.1 简要介绍一下HTTP        我们在网络的应用层中可以自己定义协议,但是,已经有大佬定义了一些现成的,非常好用的应用层协议,供我们直接使用,HTTP(超文本传输协议)就是其中之一。        在互联网世界中,HTTP(超文本传输协议)是一个至关重要的协议,他定义了客户端(如浏览器)与服务器之间如何进行通信,以交换或者传输超文本(比如HTML文档)。

如何确定 Go 语言中 HTTP 连接池的最佳参数?

确定 Go 语言中 HTTP 连接池的最佳参数可以通过以下几种方式: 一、分析应用场景和需求 并发请求量: 确定应用程序在特定时间段内可能同时发起的 HTTP 请求数量。如果并发请求量很高,需要设置较大的连接池参数以满足需求。例如,对于一个高并发的 Web 服务,可能同时有数百个请求在处理,此时需要较大的连接池大小。可以通过压力测试工具模拟高并发场景,观察系统在不同并发请求下的性能表现,从而

Anaconda 中遇到CondaHTTPError: HTTP 404 NOT FOUND for url的问题及解决办法

最近在跑一个开源项目遇到了以下问题,查了很多资料都大(抄)同(来)小(抄)异(去)的,解决不了根本问题,费了很大的劲终于得以解决,记录如下: 1、问题及过程: (myenv) D:\Workspace\python\XXXXX>conda install python=3.6.13 Solving environment: done.....Proceed ([y]/n)? yDownloa

构建高性能WEB之HTTP首部优化

0x00 前言 在讨论浏览器优化之前,首先我们先分析下从客户端发起一个HTTP请求到用户接收到响应之间,都发生了什么?知己知彼,才能百战不殆。这也是作为一个WEB开发者,为什么一定要深入学习TCP/IP等网络知识。 0x01 到底发生什么了? 当用户发起一个HTTP请求时,首先客户端将与服务端之间建立TCP连接,成功建立连接后,服务端将对请求进行处理,并对客户端做出响应,响应内容一般包括响应

Golang支持平滑升级的HTTP服务

前段时间用Golang在做一个HTTP的接口,因编译型语言的特性,修改了代码需要重新编译可执行文件,关闭正在运行的老程序,并启动新程序。对于访问量较大的面向用户的产品,关闭、重启的过程中势必会出现无法访问的情况,从而影响用户体验。 使用Golang的系统包开发HTTP服务,是无法支持平滑升级(优雅重启)的,本文将探讨如何解决该问题。 一、平滑升级(优雅重启)的一般思路 一般情况下,要实现平滑

Java http请求示例

使用HttpURLConnection public static String httpGet(String host) {HttpURLConnection connection = null;try {URL url = new URL(host);connection = (HttpURLConnection) url.openConnection();connection.setReq