Http ( Hypertext Transfer Protocol 超文本传输协议 )

Http ( Hypertext Transfer Protocol 超文本传输协议 )

简单来说两个人说话用同样的语言即可沟通,计算机之间说话(传数据)同样需要规定协议

如果没有协议计算机之间不知道怎么传输数据,通信双方可以按照协议传输数据

HTTP工作方式

在浏览器输入链接回车可以看到网页(输入网址回车后,向服务器发送请求,服务器收到请求后给浏览器响应,浏览器得到响应报文渲染页面)

整个过程可以理解为通信双方传输报文的过程

包括 Android/iOS 发送网络请求,返回数据同理

URL格式

https://baidu.com/users/?name=liyanhong

整个URL分为三部分,协议类型,服务器地址(和端口号),路径

https 协议类型

baidu.com 服务器地址

name=liyanhong 路径

报文

请求报文

响应报文

最常用的请求方法:GET / POST / PUT / DELETE

GET:获取资源;没有 Body( 不发送 Body ),对服务器数据不进行修改;

POST:增加或者修改资源;有 Body ,发送给服务器的内容在 Body 里面(不具有幂等性)

PUT:修改资源;有 Body ,发送给服务器的内容在 Body 里面(具有幂等性)

DELETE:删除资源;没有 Body( 不发送 Body ) (虽然也算修改资源,但没有 Body)

Status Code ( 状态码 ):

1** 临时性消息 。

2** 成功。常用:200(OK),201(创建成功)

3** 重定向。

4** 客户端错误。常用:400(客户端请求错误),401(认证失败),403(被禁止),404(找不到内容)

5** 服务器错误。常用:500(服务器内部错误)

Header ( HTTP 消息的元数据 )

Host :目标主机

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

① text/html 请求 Web 页面返回响应的类型,Body 中返回 html 文本;

② x-www-form-urlencoded Web 页面纯文本表单的提交方式。

格式如下:

POST /users/emails HTTP/1.1

Host: api.github.com

Content-Type: application/x-www-form-urlencoded

Content-Length: 27

name=zhangsan&sex=man

Kotlin 复制代码
// 对应 Retrofit 代码:
// Post请求如果需要在头部添加@FromUrlEncoded注解,表示请求实体是一个From表单
// 每个键值对都需要使用@Filed注解,使用@Filed添加参数,这是发送Post请求时,
// 提交请求的表单字段,必须要添加,而且需要配合@FromUrlEncoded使用
@FormUrlEncoded
@POST("/users/emails")
Call<UserBean> addUser(@Field("name") String name,@Field("sex") String sex);

// @FieldMap   请求参数注解,与Field作用一致,用于不确定表单参数
@FormUrlEncoded
@POST("user/emails")
Call<ResponseBody> getPostData(@FieldMap Map<String, Object> map);

③ multipart/form-data

POST /userform/update HTTP/1.1

Host: api.github.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--

Kotlin 复制代码
// 对应 Retrofit 代码
// @Multipart 表示请求实体是一个支持文件上传的表单,需配合@Part和@PartMap使用,适用于文件上传
// @Part 用于表单字段,适用于文件上传情况,
// @Part支持三种类型:RequestBody、MultipartBody.part、任意类型
// @PartMap   用于多文件上传,与@FieldMap和@QueryMap使用相似

@Multipart
@POST("userform/update")
fun updatePersonalInfo(@Part file: MultipartBody.Part,@QueryMap map: HashMap<String, Any>): Observable<PersonalInfoBean>

④ application/json(json形式),image/jped,application/zip ...

POST /user/getUserForm HTTP/1.1

Host: api.github.com

Content-Type: application/json; charset=utf-8

Content-Length: 38

{"name":"zhangsan","sex":"man"}

Kotlin 复制代码
// 对应 Retrofit 代码
// 使用于Post请求的还有一个注解@Body,@Body可以传递自定义类型数据给服务器
// 多用于post请求发送非表单数据,比如用传递json格式数据、hashMap、实体类等等
// @Body注释不能用于表单或者支持文件上传的表单的编码
// 不能与@FormUrlEncoded和@Multipart注解同时使用,否则会报错
@POST("userform/getUserForum")
fun queryPersonalInfo(@Body user:User): Observable<UserlInfoBean>

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

后续更新中...

相关推荐
东风破_12 小时前
Docker 基础:为什么需要容器?
前端·后端·nginx
东风破_12 小时前
Docker 实战:使用 Nginx 作为容器入口代理 Node 服务
前端·后端·nginx
你别说话了13 小时前
Vue项目解决跨域
前端·javascript·vue.js
唐青枫13 小时前
http-server:别再双击 index.html,一条命令把目录变成网站
前端·javascript
暴力求解13 小时前
Linux网络---传输层协议TCP(二)
linux·服务器·开发语言·网络·tcp/ip
网安蟹佬霸14 小时前
OSINT开源情报收集实战:从信息搜集到资产测绘(2026最新万字保姆级指南)
前端·网络·安全·web安全·网络安全·开源
a11177614 小时前
3D历史建筑展览馆 THreeJS 开源
前端·开源
单线程_0114 小时前
【源码阅读】Vue3 Tokenizer 词法分析器完整状态机流转深度梳理(3.4+ 新版架构)
前端
PBitW15 小时前
PM 丢来 3 个 Excel、12 个功能、4 种情形?用 TRAE Work 30 分钟整理成前端开发文档
前端·trae
80s77716 小时前
动态ip和静态ip有什么区别
服务器·网络·tcp/ip