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文档

相关推荐
王哈哈^_^1 小时前
【数据集】【YOLO】【目标检测】交通事故识别数据集 8939 张,YOLO道路事故目标检测实战训练教程!
前端·人工智能·深度学习·yolo·目标检测·计算机视觉·pyqt
cs_dn_Jie2 小时前
钉钉 H5 微应用 手机端调试
前端·javascript·vue.js·vue·钉钉
开心工作室_kaic2 小时前
ssm068海鲜自助餐厅系统+vue(论文+源码)_kaic
前端·javascript·vue.js
有梦想的刺儿3 小时前
webWorker基本用法
前端·javascript·vue.js
cy玩具3 小时前
点击评论详情,跳到评论页面,携带对象参数写法:
前端
qq_390161774 小时前
防抖函数--应用场景及示例
前端·javascript
John.liu_Test4 小时前
js下载excel示例demo
前端·javascript·excel
Yaml44 小时前
智能化健身房管理:Spring Boot与Vue的创新解决方案
前端·spring boot·后端·mysql·vue·健身房管理
PleaSure乐事4 小时前
【React.js】AntDesignPro左侧菜单栏栏目名称不显示的解决方案
前端·javascript·react.js·前端框架·webstorm·antdesignpro
哟哟耶耶4 小时前
js-将JavaScript对象或值转换为JSON字符串 JSON.stringify(this.SelectDataListCourse)
前端·javascript·json