postman 设置请求编码_Post请求的两种编码格式

application/x-www-form-urlencoded和multipart/form-data

在常见业务开发中,POST请求常常在这些地方使用:前端表单提交时、调用接口代码时和使用Postman测试接口时。我们下面来一一了解:

一、前端表单提交时

application/x-www-form-urlencoded

表单代码:

First name:

Last name:

通过测试发现可以正常访问接口,在Chrome的开发者工具中可以看出,表单上传编码格式为application/x-www-form-urlencoded(Request Headers中),参数的格式为key=value&key=value。

59dd0489248f

我们可以看出,服务器知道参数用符号&间隔,如果参数值中需要&,则必须对其进行编码。编码格式就是application/x-www-form-urlencoded(将键值对的参数用&连接起来,如果有空格,将空格转换为+加号;有特殊符号,将特殊符号转换为ASCII HEX值)。

application/x-www-form-urlencoded是浏览器默认的编码格式。对于Get请求,是将参数转换?key=value&key=value格式,连接到url后

multipart/form-data

那么当服务器使用multipart/form-data接收POST请求时,服务器怎么知道每个参数的开始位置和结束位置呢?

First name:

Last name:

我们在开发者工具中可以看出multipart/form-data不会对参数编码,使用的boundary(分割线),相当于&,boundary的值是----Web**AJv3。

59dd0489248f

文件上传

上传文件也要指定编码格式为multipart/form-data。

如果是SpringMVC项目,要服务器能接受multipart/form-data类型参数,还要在spring上下文配置以下内容,SpringBoot项目则不需要。

我们可以通过FormData对象模拟表单提交,用原始的XMLHttpRequest来发送数据,让我们可以在Chrome开发工具中查看到具体格式:

First name:

Last name:

提交

function submitForm() {

var formElement = document.getElementById("form");

var xhr = new XMLHttpRequest();

xhr.open("POST", "/task/testFile");

xhr.send(new FormData(formElement));

}

格式如下:

59dd0489248f

二、调用接口代码时

1、在代码中使用application/x-www-form-urlencoded编码格式设置Request属性调用接口,可以如下实现:

private static String doPost(String strUrl, String content) {

String result = "";

try {

URL url = new URL(strUrl);

//通过调用url.openConnection()来获得一个新的URLConnection对象,并且将其结果强制转换为HttpURLConnection.

HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();

urlConnection.setRequestMethod("POST");

//设置连接的超时值为30000毫秒,超时将抛出SocketTimeoutException异常

urlConnection.setConnectTimeout(30000);

//设置读取的超时值为30000毫秒,超时将抛出SocketTimeoutException异常

urlConnection.setReadTimeout(30000);

//将url连接用于输出,这样才能使用getOutputStream()。getOutputStream()返回的输出流用于传输数据

urlConnection.setDoOutput(true);

//设置通用请求属性为默认浏览器编码类型

urlConnection.setRequestProperty("content-type", "application/x-www-form-urlencoded");

//getOutputStream()返回的输出流,用于写入参数数据。

OutputStream outputStream = urlConnection.getOutputStream();

outputStream.write(content.getBytes());

outputStream.flush();

outputStream.close();

//此时将调用接口方法。getInputStream()返回的输入流可以读取返回的数据。

InputStream inputStream = urlConnection.getInputStream();

byte[] data = new byte[1024];

StringBuilder sb = new StringBuilder();

//inputStream每次就会将读取1024个byte到data中,当inputSteam中没有数据时,inputStream.read(data)值为-1

while (inputStream.read(data) != -1) {

String s = new String(data, Charset.forName("utf-8"));

sb.append(s);

}

result = sb.toString();

inputStream.close();

} catch (IOException e) {

e.printStackTrace();

}

return result;

}

public static void main(String[] args) {

String str = doPost("http://localhost:8888/task/", "firstName=Mickey%26&lastName=Mouse ");

System.out.println(str);

}

2、在代码中使用multipart/form-data编码格式设置Request属性调用接口时,其中boundary的值可以在设置Content-Type时指定,让服务器知道如何拆分它接受的参数。通过以下代码的调用接口:

private static String doPost(String strUrl, Map params, String boundary) {

String result = "";

try {

URL url = new URL(strUrl);

HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();

urlConnection.setRequestMethod("POST");

urlConnection.setConnectTimeout(30000);

urlConnection.setReadTimeout(30000);

urlConnection.setDoOutput(true);

//设置通用请求属性为multipart/form-data

urlConnection.setRequestProperty("content-type", "multipart/form-data;boundary=" + boundary);

DataOutputStream dataOutputStream = new DataOutputStream(urlConnection.getOutputStream());

for (String key : params.keySet()) {

String value = params.get(key);

//注意!此处是\r(回车:将当前位置移到本行开头)、\n(换行:将当前位置移到下行开头)要一起使用

dataOutputStream.writeBytes("--" + boundary + "\r\n");

dataOutputStream.writeBytes("Content-Disposition: form-data; name=\"" + encode(key) + "\"\r\n");

dataOutputStream.writeBytes("\r\n");

dataOutputStream.writeBytes(encode(value) + "\r\n");

}

//最后一个分隔符的结尾后面要跟"--"

dataOutputStream.writeBytes("--" + boundary + "--");

dataOutputStream.flush();

dataOutputStream.close();

InputStream inputStream = urlConnection.getInputStream();

byte[] data = new byte[1024];

StringBuilder sb = new StringBuilder();

while (inputStream.read(data) != -1) {

String s = new String(data, Charset.forName("utf-8"));

sb.append(s);

}

result = sb.toString();

inputStream.close();

} catch (Exception e) {

e.printStackTrace();

}

return result;

}

private static String encode(String value) throws UnsupportedEncodingException {

return URLEncoder.encode(value, "UTF-8");

}

public static void main(String[] args) {

Map params = new HashMap<>();

params.put("firstName", "Mickey");

params.put("lastName", "Mouse");

//自定义boundary,有两个要求:使用不会出现在发送到服务器的HTTP数据中的值;并在请求消息中的分割位置都使用相同的值

String boundary = "abcdefg";

String str = doPost("http://localhost:8888/testFile", params, boundary);

System.out.println(str);

}

通过debug,可以看出dataOutputStream的值如下:

59dd0489248f

三、使用Postman测试接口时

1、POST请求 -> Body -> x-www-form-urlencoded

59dd0489248f

当切换为x-www-form-urlencoded时,Headers会自动添加Content-Type:application/x-www-form-urlencoded

59dd0489248f

当请求Send后,此时点Code,可以查看到和Chrome开发工具中(Request Headers处的Content-Type和Form Data)一样的数据

59dd0489248f

2、POST请求 -> Body -> form-data

相当于html表单请求,value可为Text或文件。

59dd0489248f

可以不用手动指定编码格式,也可以指定编码为multipart/form-data

59dd0489248f

划线处的分割线应该是被省略了。

59dd0489248f

可以更改左上角的类型,来查看相应的Headers代码,常见的是下面三种:

Java OK HTTP:

59dd0489248f

JavaScript Jquery AJAX:

59dd0489248f

JavaScript XHR:

59dd0489248f

总结

POST请求的两种编码格式:application/x-www-urlencoded是浏览器默认的编码格式,用于键值对参数,参数之间用&间隔;multipart/form-data常用于文件等二进制,也可用于键值对参数,最后连接成一串字符传输(参考Java OK HTTP)。除了这两个编码格式,还有application/json也经常使用。

接口代码

@RequestMapping("/task")

public class TaskController {

@RequestMapping("/")

public String index(String firstName, String lastName) {

return firstName + lastName;

}

@RequestMapping("/testFile")

public String testFile(String firstName, String lastName, MultipartFile file) {

String result = firstName + lastName;

if (file != null) {

result += (file.getOriginalFilename() != null) ? file.getOriginalFilename() : "";

}

return result;

}

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Postman中,可以通过以下步骤进行编码格式设置: 1. 打开Postman应用程序并创建一个新的请求或打开已有的请求。 2. 在请求设置(Request Settings)页面,找到"Headers"或"Headers and Parameters"部分。 3. 在"Headers"或"Headers and Parameters"部分中,找到"Encode"或"Parameter Encoding"选项。 4. 选择所需的编码格式,例如"URL Encoding"(URL编码)、"JSON"(JSON编码)或"Form Data"(表单数据编码)。 URL编码(URL Encoding)是一种常见的编码格式,用于将特殊字符转换为它们在URL中的表示形式。它通常用于处理包含特殊字符的URL参数。 JSON编码(JSON Encoding)是一种用于将数据结构转换为JSON格式的编码方式。在Postman中,您可以将请求体或响应体设置为JSON格式,并使用JSON编码来处理这些数据。 表单数据编码(Form Data Encoding)是一种用于处理表单数据的编码方式。它可以将表单字段和值转换为适合传输的形式。在Postman中,您可以使用表单数据编码设置请求体中的字段和值。 选择适当的编码格式后,您可以在请求设置中进一步配置其他选项,如请求方法(GET、POST等)、请求头(Headers)和请求体(Body)。根据您的需求,您还可以设置请求的参数(Parameters)和 cookies(Cookies)。 请注意,具体的编码格式设置可能因Postman版本和配置而有所不同。确保查阅Postman文档以获取准确的信息和设置步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值