HTTP请求基础|请求方法与提交数据

前言

HTTP请求基础几乎是每一位软件开发者必备的知识点,大部分呈现给用户的页面/数据都是从远程服务器拉取,故我们需要对这块的知识有一定了解

本文阅读成本与收益如下:

阅读耗时:10mins

全文字数:5k+

预期效益

  • 请求方法类型
  • 提交数据的五种方式

请求方法类别

HTTP请求方法(HTTP request methods)是用于向Web服务器发出特定请求的几种方式

如图,在浏览器地址栏输入一个链接访问后在F12开发者工具的Network就能看到当前页面涉及到的请求方法类别

以下是常见的HTTP请求方法及其应用范围:

  1. 【常用】GET(GET请求):用于获取资源,最常用的请求方法,通常用于从服务器获取数据,例如获取网页内容、获取API结果等
  2. 【常用】POST(POST请求):用于提交数据,通常用于向服务器提交表单数据、上传文件等
  3. PUT(PUT请求):用于更新资源,通常用于更新服务器上的数据或资源,例如更新API中的某项资源
  4. PATCH(PATCH请求):用于部分更新资源,与PUT请求类似,但只更新资源的一部分,而不是整个资源
  5. DELETE(DELETE请求):用于删除资源,通常用于从服务器上删除数据或资源
  6. OPTIONS(OPTIONS请求):用于获取服务器支持的HTTP请求方法,通常用于了解服务器支持哪些请求方法,以及服务器的性能和跨域限制等
  7. HEAD(HEAD请求):和GET请求类似,但只返回HTTP响应头部信息,而不返回实际的数据或资源,通常用于检查资源的有效性、日期等

请求提交数据的五种方式

WEB开发中,向服务端提交数据是一项基本功能,网页端JavaScript会使用浏览器运行环境提供的 xhr/fetch API来实现。

以下是五种常见的数据传递方式:

1. URL参数(URL param)

URL路径中的参数(url param),服务端程序或者网页应用都可以从 url 中解析出参数并赋值给对应的应用

例子:(app_id: 2023001、user_id:10001)

yaml 复制代码
GET /user/10001/app/2023001 HTTP/1.1
Host: example.com
Pragma: no-cache
Cache-Control: no-cache
Accept: application/json, text/plain, */*
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36
Origin: http://127.0.0.1:5173
Referer: http://127.0.0.1:5173/
Accept-Encoding: gzip
Accept-Language: zh-CN,zh;q=0.9
Connection: keep-alive
bash 复制代码
# user_id=10001
https://example.com/user/10001
https://example.com/user/${user_id}
# user_id=10001|app_id=2023001
https://example.com/user/10001/app/2023001
https://example.com/user/${user_id}/app/${app_id}

这里的user_id、app_id变量名均为后端服务自行设置,只需要解析出URL当中对应位置的值并赋值给自定义的变量即可

2. 【常用】查询字符串(Query)

通过 URL 中 ?以及后面用 &分隔的字符串承载需要传递的数据

query 字符串要用 encodeURIComponent 的 api 进行格式处理

例子:(name: 陈、user_id:10001)

makefile 复制代码
GET /user?user_id=10001&name=%E9%99%88 HTTP/1.1
Host: example.com
Accept: application/json, text/plain, */*
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36
Origin: http://127.0.0.1:5173
Referer: http://127.0.0.1:5173/
Accept-Encoding: gzip
Accept-Language: zh-CN,zh;q=0.9
Connection: keep-alive

JS最终使用的URL转换:

ini 复制代码
const queryString = require('query-string');
let url = 'https://example.com/user';
const queryStr = queryString.stringify({
  name: '陈',
  user_id: 10001,
}); // ?name=%E9%99%88&age=20
url = url + queryStr;
perl 复制代码
# user_id=10001|name=%E9%99%88
https://example.com/user?user_id=10001&name=%E9%99%88

user_idname :query 传递的数据

3. 表单URL编码(form-urlencoded)

请求数据包的header当中的字段 content-typeapplication/x-www-form-urlencoded

需要传递的数据由请求数据包的 body 承载,数据格式与query保持一致

例子:(name: 陈、user_id:10001)

header:2-11行

body:13行

makefile 复制代码
POST /user HTTP/1.1
Host: example.com
Content-Length: 28
Accept: application/json, text/plain, */*
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Origin: http://127.0.0.1:5173
Referer: http://127.0.0.1:5173/
Accept-Encoding: gzip
Accept-Language: zh-CN,zh;q=0.9
Connection: keep-alive

name=%E9%99%88&user_id=10001

4. 表单数据(form-data)

请求数据包的header当中的字段 content-typemultipart/form-data; boundary=XXXXXX

body 当中用content-type当中指定的 boundary 分割线来分割内容,适合进行文件传输(支持传输多个文件)

例子:(name: 陈、user_id:10001)

header:2-11行

body:13-21行

makefile 复制代码
POST /user HTTP/1.1
Host: example.com
Content-Length: 237
Accept: application/json, text/plain, */*
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarylSuJ2i7ta7qAjWGO
Origin: http://127.0.0.1:5173
Referer: http://127.0.0.1:5173/
Accept-Encoding: gzip
Accept-Language: zh-CN,zh;q=0.9
Connection: keep-alive

------WebKitFormBoundarylSuJ2i7ta7qAjWGO
Content-Disposition: form-data; name="user_id"

10001
------WebKitFormBoundarylSuJ2i7ta7qAjWGO
Content-Disposition: form-data; name="name"

陈
------WebKitFormBoundarylSuJ2i7ta7qAjWGO--

5. JSON数据(json)

请求数据包的header当中的字段 content-typeapplication/json

数据在请求数据包的 body

例子:(name: 陈、user_id:10001)

header:2-13行

body:第15行

makefile 复制代码
POST /user HTTP/1.1
host: example.com
content-length: 33
accept: application/json, text/plain, */*
content-type: application/json;charset=UTF-8
user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36
sec-ch-ua-platform: "macOS"
origin: http://127.0.0.1:5173
referer: http://127.0.0.1:5173/
accept-encoding: gzip
accept-language: zh-CN,zh;q=0.9
cookie: time=1690102352;
Connection: close

{"content":"陈","user_id":10001}

讲到最后

每种请求方法类别以及请求数据提交方式都有其特定的用途和特点,需要根据具体的业务需求场景选择合适的方式进行前后端数据传递。

感谢各位看到这里,如果你觉得本节内容还不错的话,欢迎各位的点赞、收藏、评论,大家的支持是我做内容的最大动力

本文为作者原创,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利

参考补充

MDN文档

相关推荐
__雨夜星辰__5 分钟前
TypeScript 入门学习笔记(面向对象 + 常用设计模式)
前端·学习·typescript
晚霞的不甘21 分钟前
HarmonyOS ArkTS 进阶实战:深入理解边距、边框与嵌套布局
前端·计算机视觉·华为·智能手机·harmonyos
_野猪佩奇_牛马版21 分钟前
ReACT Agent 开发知识点总结
前端
牛奶32 分钟前
你发送的消息,微信到底怎么送到的?
前端·websocket·http
酉鬼女又兒38 分钟前
零基础快速入门前端DOM 元素获取方法详解:从代码到实践(可用于备赛蓝桥杯Web应用开发)
前端·javascript·职场和发展·蓝桥杯·js
牛奶38 分钟前
为什么关掉浏览器再打开,你还是登录状态?
前端·网络协议·https
bjxiaxueliang39 分钟前
一文掌握Python aiohttp:异步Web开发从入门到部署
开发语言·前端·python
Liudef061 小时前
从0到1开发ReAct智能体:原理、实现与最佳实践
前端·react.js·前端框架
金豆呀1 小时前
WPS自定义公式,相似度匹配
前端·javascript·wps
jiayong231 小时前
0基础学习VUE3 第 1 课:项目启动流程
前端·vue.js·学习