HTTP请求入参类型解读

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.mzph.cn/pingmian/49930.shtml

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

相关文章

kafka架构+原理+源码

1.安装jdk17 sudo yum -y update sudo wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.rpm sudo yum -y install ./jdk-17_linux-x64_bin.rpm、 sudo java -version 2.安装kafka How to easily install kafka without zookeeper | Aditya’s Blog …

一文了解AOL算子加速库

过去一年,随着ChatGPT的发布与快速迭代,基于大数据量、大参数量、大算力的预训练大模型已成为人工智能产业的主要路线。大模型的普及与发展不仅依靠模型本身的创新,更依赖于算力底座的支撑以及软件生态的繁荣,需要伙伴和开发者的积…

Vue3逻辑复用及内置组件

Vue3的逻辑复用主要通过“组合式函数”、“自定义指令”及“插件”来实现。提高了代码复用性,增强代码可维护性及促进团队合作。 1 逻辑复用 1.1 组合式函数 利用Vue组合式API来封装和复用有状态逻辑的函数。对组合式函数有如下约定: 命名&#xff0…

Sentinel限流规则详解

上一期教程讲解了 Sentinel 的快速入门:Sentinel快速入门,这一期主要讲述 Sentinel 的限流规则 簇点链路 簇点链路就是项目内的调用链路(Controller -> Service -> Mapper),链路中被监控的每个接口就是一个资源…

wkhtmltopdf 工具安装与使用

前情提要: 最近一个同事请叫我一个问题,他发现一片不错的博文,是在博客园的,但是不能下载这篇文章,我看了一下才发现,原来csdn也是不行的。合理。毕竟是人家辛苦写的文章,不能就这么被别人随便c…

《Java初阶数据结构》----7.<优先级队列PriorityQueue>

前言 大家好,我目前在学习java。之前也学了一段时间,但是没有发布博客。时间过的真的很快。我会利用好这个暑假,来复习之前学过的内容,并整理好之前写过的博客进行发布。如果博客中有错误或者没有读懂的地方。热烈欢迎大家在评论区…

[渗透测试] 主动信息收集

主动信息收集 在红蓝对抗过程中,资产属于核心地位,攻击方(红方)要尽可能的去获取对方资产,暴露目标资产,包括IP地址、网络设备、安全设备、服务器、存储在服务器中的数据等。防守方也要清楚自己有多少有价…

宝塔SSL续签失败

我有2个网站a和b(文字中用baidu.com替换我的域名) b是要续签那个,但续签报错: nginx version: nginx/1.22.1 nginx: [emerg] host not found in upstream "github.com" in /www/server/panel/vhost/nginx/proxy/a.bai…

设计模式--创建型

实现 #include <iostream> #include <memory>// 抽象产品类 class Product {public:virtual ~Product() {}virtual void Operation() const 0; };// 具体产品 类A class ConcreteProductA : public Product {public:virtual void Operation() const override {st…

ESP-01S、ESP8266、ESP32等模块通信乱码的排查方法

ESP-01S、ESP8266、ESP32等模块通信乱码的排查方法 ESP-01S模块 遇到问题首先按重要顺序及排除法来解决问题 1&#xff0c;你的USB转串口工具是否有问题&#xff1f; 请将TXD与RXD短接在一起进行测试&#xff0c;自收自发应该是正常的&#xff0c;请确保这点。 ESP-01S的串口…

ffmpeg ffplay.c 源码分析二:数据读取线程

本章主要是分析 数据读取线程read_thread 中的工作。如上图红色框框的部分 从ffplay框架分析我们可以看到&#xff0c;ffplay有专⻔的线程read_thread()读取数据&#xff0c; 且在调⽤av_read_frame 读取数据包之前需要做&#xff1a; 1.例如打开⽂件&#xff0c; 2.查找配置解…

Servlet 3.0的新特征

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhlServlet 3.0概述 Servlet 3.0规范是在2009年随着Java EE 6的发布而推出的。它引入了一系列新特性和改进,旨在简化Web应用的开发和部署过程,并提高Web应用的性能和可扩展性。Servlet 3.0的发布标…

大语言模型-对比学习-Contrastive Learning

一、对比学习概念 对比学习是一种特殊的无监督学习方法。 旨在通过拉近相关样本的距离并且推远不相关样本的距离&#xff0c;来学习数据表示。 通常使用一种高自由度、自定义的规则来生成正负样本。在模型预训练中有着广泛的应用。 二、对比学习小案例 对比学习主要分为三个…

02 MySQL数据库管理

目录 1.数据库的结构 sql语言主要由以下几部分组成 2. 数据库与表的创建和管理 1&#xff0c;创建数据库 2&#xff0c;创建表并添加数据 3&#xff0c;添加一条数据 4&#xff0c;查询数据 5&#xff0c;更新数据 6&#xff0c;删除数据 3.用户权限管理 1.创建用户 …

js轮播图制作

实现一个简单的JavaScript轮播图可以通过以下步骤完成&#xff1a; 创建HTML结构&#xff0c;包括轮播图容器和图片列表。 使用CSS进行样式设置&#xff0c;包括隐藏多余的图片。 使用JavaScript编写函数来控制图片的切换。

C#中栈和堆以及修饰符

关于堆中字符串的存放 string s1"123" string s2"123" string s1"456" 此时s1输出为456 而s2仍然为123 因为在使用 String str "字符串" 的方式来创建String变量的时候&#xff0c;那么String的值便会存储在String常量池中&#x…

Keepalived和Haproxy

Keepalived和Haproxy 一、Keepalived 1、keepalived概念 调度器的高可用 vip地址主备之间的切换&#xff0c;主在工作时&#xff0c;vip地址值在主上&#xff0c;主停止工作&#xff0c;vip飘移到备服务器 在主备的优先级不变的情况下&#xff0c;主恢复工作&#xff0c;v…

C++——编译报重复定义错误的解决办法

原因&#xff1a; 头文件被多次编译。 解决办法&#xff1a; 找到包含头文件的地方&#xff0c;仔细检查。 比如&#xff1a; 这两句话是包含关系&#xff0c;写了第一句就不用第二句了。 因为&#xff1a;第一句是编译 tracker/detector/rknn_model_zoo/examples/yolov5/c…

【MySQL进阶之路 | 高级篇】简谈redo日志

1. 前言 事务有四种特性&#xff1a;原子性&#xff0c;一致性&#xff0c;隔离性和持久性。那么事务的四种特性到底是基于什么机制实现呢&#xff1f; 事务的隔离性由锁机制实现。而事务的原子性&#xff0c;一致性和持久性由事务的redo日志和undo日志来保证。 REDO LOG称为…

云计算实训13——DNS域名解析、ntp时间服务器配置、主从DNS配置、多区域DNS搭建

一、DNS域名解析 1.正向解析 将域名解析为IP地址 DNS正向解析核心配置 (1)安装bind [rootdns ~]# yum -y install bind (2)编辑配置文件 编辑named.conf文件&#xff0c;限定访问权限 [rootdns ~]# vim /etc/named.conf 编辑named.rfc文件&#xff0c;指定要访问的域名 [ro…