HTTP请求入参类型解读

news2024/11/12 16:42:38

HTTP请求入参类型解读

Content-Type

在HTTP请求中,Content-Type请求头用于指示资源的MIME类型,即请求体的媒体类型。它告诉服务器实际发送的数据类型是什么,以便服务器能够正确地解析和处理这些数据。Content-Type可以有多种值,每种值都对应着不同的媒体类型。以下是一些常见的Content-Type值及其区别:

  1. application/x-www-form-urlencoded
  • 这是最常见的表单数据提交方式,表单数据被编码为键值对,类似于URL的查询字符串(但不需要URL的?前缀)。例如:key1=value1&key2=value2
  • 它通常用于HTML表单的提交,其中enctype属性被设置为application/x-www-form-urlencoded(这是默认值)。
  • 它不支持上传文件。
  1. multipart/form-data
  • 当需要上传文件时,enctype应该被设置为multipart/form-data。这种类型的数据会将表单数据编码为一条消息,其中包含多个部分,每个部分都可以是文本或文件。
  • 它使用分界线(boundary)来分割不同的部分,每个部分都有自己的Content-TypeContent-Disposition(如form-data)等头部信息。
  • 它支持文件上传和二进制数据。
  1. application/json
  • 当请求体是JSON格式的数据时,应使用application/json作为Content-Type。JSON是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。
  • 它广泛用于AJAX和RESTful API中,以提供和接收结构化的数据。
  1. text/plain
  • 当请求体是纯文本时,可以使用text/plain。这意呀着数据以纯文本形式发送,没有HTML或XML等标记。
  • 它通常用于发送简单的文本消息或日志数据。
  1. text/html
  • 尽管在HTTP请求中不常见(因为HTML通常用于响应体),但在某些情况下,如果客户端想要发送HTML代码给服务器,可能会使用text/html作为Content-Type
  • 这通常不是最佳实践,因为发送HTML代码到服务器可能会带来安全风险。
  1. application/xmltext/xml
  • 当请求体是XML格式的数据时,可以使用application/xmltext/xml。XML是一种标记语言,用于数据的存储和传输。
  • application/xml表示XML数据是应用程序的一部分,而text/xml则更强调数据的文本性质。然而,在实践中,这两者之间的区别并不明显,很多服务器和客户端都能处理这两种类型。

每种Content-Type都对应着不同的数据格式和用途,选择合适的Content-Type对于确保数据被正确解析和处理至关重要。

入参形式

在HTTP请求中,request payload(请求负载)和formData(表单数据)都用于向服务器发送数据,但它们的使用场景和编码方式有所不同。

request payload

在这里插入图片描述
request payload 是在发送POST或PUT请求时,请求体(Body)中包含的数据。这个数据可以是JSON、XML等格式,用于向服务器传递复杂的数据结构。当使用application/json作为Content-Type时,请求体中的数据通常就是JSON格式的request payload

特点

  • 适用于发送JSON、XML等结构化的数据。
  • Content-Type通常设置为application/jsonapplication/xml等。
  • 数据不是通过表单提交的方式发送的,因此不直接对应HTML表单。

formData

在这里插入图片描述
formData是模拟HTML表单数据的一种编码方式,主要用于发送包含文件的请求。当HTML表单的enctype属性设置为multipart/form-data时,表单中的数据就会以formData的格式发送。在AJAX请求中,也可以使用JavaScript的FormData对象来手动构造这样的数据。

特点

  • 适用于需要上传文件的场景。
  • 数据以multipart/form-data 编码方式发送,可以包含多个字段和文件。
  • 字段和文件以Content-DispositionContent-Type等HTTP头部信息分隔。
  • 在JavaScript中,可以通过FormData API构造和发送formData

示例

JavaScript中发送formData
let formData = new FormData();
formData.append('username', 'exampleUser');
formData.append('file', fileInput.files[0]); // 假设fileInput是一个文件输入元素

fetch('/upload', {
  method: 'POST',
  body: formData,
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));

在这个例子中,formData对象包含了一个文本字段username和一个文件file,它们都将以multipart/form-data的格式发送到服务器。

JavaScript中发送JSON作为request payload
let data = {
  username: 'exampleUser',
  // 其他字段...
};

fetch('/api/data', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify(data),
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));

在这个例子中,一个JavaScript对象被序列化成JSON字符串,并作为request payload发送到服务器。这里使用的是application/json作为Content-Type

常见的Request Content Type

发送表单数据FormData

application/x-www-form-urlencodedmultipart/form-data 是两种在HTTP请求中发送表单数据(form data)的常见内容类型(Content-Type)。它们各自有不同的使用场景和特性。

application/x-www-form-urlencoded
  • 使用场景:主要用于发送不包含文件的简单表单数据。当HTML表单的enctype属性未被设置或显式设置为application/x-www-form-urlencoded时,表单数据就会以这种方式发送。
  • 数据编码方式:表单中的每个字段都被编码为key=value的形式,多个字段之间用&字符连接。特殊字符(如空格、标点符号等)会被编码为%XX格式的十六进制数(其中XX是该字符的ASCII码的十六进制表示)。
  • 示例:如果表单包含字段name=Johnage=30,则发送的数据可能看起来像这样:name=John&age=30
  • 限制:由于编码方式和传输格式的限制,这种类型不适合用于发送大量数据或包含二进制数据的文件。
传参示例
const myHeaders = new Headers();
myHeaders.append("Content-Type", "application/x-www-form-urlencoded");

//参数构造形式
const urlencoded = new URLSearchParams();
urlencoded.append("text", "测试123");
urlencoded.append("name", "lucy");

const requestOptions = {
  method: "POST",
  headers: myHeaders,
  body: urlencoded,
  redirect: "follow"
};

fetch("https://dict.youdao.com/keyword/key", requestOptions)
  .then((response) => response.text())
  .then((result) => console.log(result))
  .catch((error) => console.error(error));

上面代码中的参数构造形式还可以直接写成以下形式

const urlencoded = "text=测试123&name=lucy" // 等价于 上面的 urlencoded.toString()

如果你的参数是个json对象,可以通过下面的形式转换后,作为formData提交

const params = {
    "test": "测试123",
    "name": "lucy"
}

const urlencoded = Object.keys(params).map(key=>`${encodeURIComponent(key)}=${encodeURIComponent(params[key])}`).join('&')
multipart/form-data
  • 使用场景:主要用于发送包含文件的表单数据。当HTML表单的enctype属性设置为multipart/form-data时,表单数据就会以这种方式发送。
  • 数据编码方式:数据被分割成多个部分(parts),每个部分都包含字段的Content-Disposition(描述字段名和可能的文件名)和Content-Type(描述该部分数据的MIME类型)头部信息。文件内容作为其中一个或多个部分发送,而文本字段则以key=value的形式编码并作为其他部分发送。
  • 示例:一个包含文件和文本字段的表单提交时,请求体可能会包含多个部分,每部分都有自己的头部信息和数据内容。
  • 优势:支持发送大量数据和包含二进制数据的文件,是上传文件的标准方式。

在支持FormData对象的执行环境中,可通过 new FormData来构造表单数据

const myHeaders = new Headers();
myHeaders.append"content-type","multipart/form-data");

const formdata = new FormData();
formdata.append("text", "申请开票");
formdata.append("name", "lucy");

const requestOptions = {
  method: "POST",
  headers: myHeaders,
  body: formdata,
  redirect: "follow"
};

fetch("https://dict.youdao.com/keyword/key", requestOptions)
  .then((response) => response.text())
  .then((result) => console.log(result))
  .catch((error) => console.error(error));

如果当前执行环境不支持FormData对象,可根据FormData的参数形式手工构造,也能达到相应效果。包含文件流的不建议

function generateSimpleId() {
  return (
    '----WebKitFormBoundary' + Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15)
  )
}

function jsonToFormData(data, boundary) {
  let arr = []
  for (let key in data) {
    arr.push(`\r\n--${boundary}\r\nContent-Disposition: form-data;name="${key}"\r\n\r\n${data[key]}`)
  }
  arr.push(`\r\n--${boundary}--`)
  return arr.join('')
}

const boundary = generateSimpleId()
const myHeaders = new Headers();
myHeaders.append("content-type",`multipart/form-data;boundary=${boundary}`)

const params = {
    "text": "test",
    "name": "lucy"
}
const formdata = jsonToFormData(params,boundary)

const requestOptions = {
  method: "POST",
  headers: myHeaders,
  body: formdata,
  redirect: "follow"
};

fetch("https://dict.youdao.com/keyword/key", requestOptions)
  .then((response) => response.text())
  .then((result) => console.log(result))
  .catch((error) => console.error(error));
选择哪种类型?
  • 如果你的表单只包含文本字段且不需要上传文件,那么application/x-www-form-urlencoded是一个简单且高效的选择。
  • 如果你的表单需要上传文件,或者包含二进制数据,那么multipart/form-data是必需的。

在JavaScript中,你可以使用FormData对象来构造这两种类型的请求体。FormData对象会自动处理字段的编码和文件的上传,而无需你手动设置Content-Type头部(尽管在某些情况下,你可能需要设置其他头部信息)。当使用fetchXMLHttpRequest等API发送请求时,只需将FormData对象作为请求体(body)即可。

发送payload

application/json

这种json格式传参是POST请求中常用的类型,其传参格式如下

const myHeaders = new Headers();
myHeaders.append("Content-Type", "application/json");

const raw = JSON.stringify({
  "test": "测试123",
  "name": "lucy"
});

const requestOptions = {
  method: "POST",
  headers: myHeaders,
  body: raw,
  redirect: "follow"
};

fetch("https://dict.youdao.com/keyword/key", requestOptions)
  .then((response) => response.text())
  .then((result) => console.log(result))
  .catch((error) => console.error(error));

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1948226.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

13.2 MongoDB

13.2 MongoDB 1. 概述2. docker安装3. SpringBoot整合MongoDB3.1 依赖3.2 配置连接1. 基于`yml`配置2. 基于配置类配置3.3 启动项坑1坑23.4 新增业务1. 实体类映射2. 数据层3. 业务层4. 控制层5. 测试结果3.5 单条记录查询业务1. 数据层2. 业务层3. 控制层4. 断点测试3.6 分页查…

代码随想录算法训练营day6 | 242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1.两数之和

文章目录 哈希表键值 哈希函数哈希冲突拉链法线性探测法 常见的三种哈希结构集合映射C实现std::unordered_setstd::map 小结242.有效的字母异位词思路复习 349. 两个数组的交集使用数组实现哈希表的情况思路使用set实现哈希表的情况 202. 快乐数思路 1.两数之和思路 总结 今天是…

FoundationDB 基本使用

目录 一、FoundationDB介绍 二、安装单机版FoundationDB 2.1 下载安装程序 2.2 安装FoundationDB 2.3 修改配置信息 2.4 管理FoundationDB服务 三、fdbcli的常用命令 3.1连接数据库 3.2退出fdbcli 3.3查看版本 3.4 写模式 3.5写入键值 3.6读取键值 3.7删除键值 …

花几千上万学习Java,真没必要!(二十七)

1、Math类: package mathtest.com; public class MathDemo { public static void main(String[] args) { // 定义圆的半径 double radius 5.0; // 计算并打印圆的周长 double circumference 2 * Math.PI * radius; System.out.printf("圆的周长: %.2f…

Vue 状态管理 Vue CLI

Vue 状态管理 & Vue CLI 1、状态管理2、集中状态管理2.1 Vuex2.1.1 Vuex核心概念2.1.2 Vuex Store实例2.1.3 Vuex Getter2.1.4 Vuex Mutation2.1.4 Vuex Actions2.1.4 Vuex Module 2.2 Pinia2.2.1功能增强 3、Vuex 实现原理4、Pinia 实现原理5、CLI5.1 实现 1、状态管理 将…

【机器学习】激活函数:神经网络的灵魂

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 激活函数:神经网络的灵魂什么是激活函数?常见激活函数类型1. Sigmo…

Linux环境安装KubeSphere容器云平台并实现远程访问Web UI 界面

文章目录 前言1. 部署KubeSphere2. 本地测试访问3. Linux 安装Cpolar4. 配置KubeSphere公网访问地址5. 公网远程访问KubeSphere6. 固定KubeSphere公网地址 前言 本文主要介绍如何在Linux CentOS搭建KubeSphere并结合Cpolar内网穿透工具,实现远程访问,根…

UE4调试UE4Editor-Cmd.exe

在工作中,我们看到这样的构建命令: %EnginePath%\Binaries\Win64\UE4Editor-Cmd.exe %ClientPath%\%ProjectName%.uproject -runHotPatcher {其它参数} 我们应该如何调试UE4Editor-Cmd.exe呢?其实调试 UE4Editor.exe 就可以了(参考…

Mac安装Hoomebrew与升级Python版本

参考 mac 安装HomeBrew(100%成功)_mac安装homebrew-CSDN博客 /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" 安装了Python 3.x版本,你可以使用以下命令来设置默认的Python版本: # 首先找到新安…

IDEA安装并使用通义灵码

IDEA安装并使用通义灵码 通义灵码介绍安装通义灵码 通义灵码介绍 在数字革命的前沿,阿里云技术团队匠心独运,倾力打造“通义灵码”——一个融合尖端科技的智能编码助手,旨在革新软件工程的未来。 实时代码扩展 通义灵码具备深度理解代码脉络的…

opencascade AIS_Line源码学习

前言 AIS_Line 是 OpenCASCADE 库中的一个类,用于表示和操作三维直线。它可以通过几何线(Geom_Line)或者两个几何点(Geom_Point)来初始化。 方法 1 //! 初始化直线 aLine。 Standard_EXPORT AIS_Line(const Handl…

8.0.32 mysql 配置主从数据库

配置前提: 两台服务器都需要安装同一版本的mysql数据库 我的版本是8.0.32 数据库参数修改 主数据库my.cnf(linux)或my.ini(win)配置: 这里需要注意:server-id必须唯一主从两个库必须要不一样 log_binmysql-bin server-id24 gtid-modeON …

yolov8训练自己的实例分割数据集

参考: 1、官方教程:https://docs.ultralytics.com/zh/tasks/segment/ 2、YOLOv8制作自己的实例分割数据集保姆级教程(包含json转txt) 下载最新yolov8代码 git clone https://github.com/ultralytics/ultralytics.git一、制作自…

vue学习day12-声明式导航续、路由重定向、Vue路由-404、Vue路由-模式设置、编程式导航

34、声明式导航续 (4)跳转传参 1)跳转传参 ①语法: 传递:to“/path?参数名值” 接收:如果在模版里,通过$route.query.参数名获取,如果在js代码里,通过this. $route…

代码随想录算法训练营第六十四天|Floyd 算法、A * 算法、最短路算法总结

97. 小明逛公园 Floyd 算法 Floyd-Warshall算法是一种用于求解图中所有节点对之间最短路径的经典算法。它的时间复杂度为O(n^3),适用于节点数量不多(通常不超过几百个)的密集图。该算法不仅能处理带权有向图,还能处理带权无向图。…

模拟建造游戏:城市:天际线2(都市天际线2)中文免安装,解压即撸

《城市:天际线2》(Cities: Skylines II)是一款模拟经营游戏,由Colossal Order开发,Paradox Interactive发行。 下载地址:https://pan.quark.cn/s/84e69332ec3e 更多游戏:https://kdocs.cn/l/cuH…

vue3引入openlayers

安装ol包 OpenLayers作为 ol npm包提供,它提供了官方支持的API的所有模块。 官方地址:ol npm install ol模块和子模块约定 具有CamelCase名称的OpenLayers模块提供类作为默认导出,并且可能包含其他常量或函数作为命名导出: i…

HarmonyOS Next 省市区级联(三级联动)筛选框

效果图 完整代码 实例对象 export class ProvinceBean {id?: stringpid?: stringisSelect?: booleandeep?: objectextName?: stringchildren?: ProvinceBean[] }级联代码 import { MMKV } from tencent/mmkv/src/main/ets/utils/MMKV import { ProvinceBean } from ..…

MLIR的TOY教程学习笔记

MLIR TOY Language 文章目录 MLIR TOY Language如何编译该项目ch1: MLIR 前端IR解析ch2: 定义方言和算子 (ODS)1. 定义方言2. 定义OP3. OP相关操作4. 定义OP ODS (Operation Definition Specification)1. 基本定义2. 添加文档3. 验证OP4. 新增构造函数5. 定义打印OP的格式 ch3:…

【数据结构】:用Java实现链表

在 ArrayList 任意位置插入或者删除元素时,就需要将后序元素整体往前或者往后搬移,时间复杂度为 O(n),效率比较低,因此 ArrayList 不适合做任意位置插入和删除比较多的场景。因此:java 集合中又引入了 LinkedList&…