📌  相关文章
📜  网络技术问题 | Node.js 测验 |第 3 组 |问题 7(1)

📅  最后修改于: 2023-12-03 14:57:02.863000             🧑  作者: Mango

网络技术问题 | Node.js 测验 | 第 3 组 | 问题 7

简介

本测验将涉及 Node.js 方面的问题,主要考察程序员对于网络技术的了解。

问题
问题描述

在 Node.js 中,我们使用 http 模块进行 HTTP 通信。对于 POST 请求一般有两种方式来传递参数,一种是 urlencoded,一种是 JSON 具体的方式如下:

urlencoded

const http = require('http');
const querystring = require('querystring');

const postData = querystring.stringify({
  'msg': 'Hello World!'
});

const options = {
  hostname: 'www.baidu.com',
  port: 80,
  path: '/',
  method: 'POST',
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded',
    'Content-Length': Buffer.byteLength(postData)
  }
};

const req = http.request(options, (res) => {
  console.log(`statusCode: ${res.statusCode}`);

  res.on('data', (d) => {
    process.stdout.write(d);
  });
});

req.on('error', (error) => {
  console.error(error);
});

req.write(postData);
req.end();

JSON

const http = require('http');

const data = JSON.stringify({
  name: 'John Doe',
  age: 25
});

const options = {
  hostname: 'localhost',
  port: 5000,
  path: '/user',
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Content-Length': Buffer.byteLength(data)
  }
};

const req = http.request(options, (res) => {
  console.log(`statusCode: ${res.statusCode}`);

  res.on('data', (d) => {
    process.stdout.write(d);
  });
});

req.on('error', (error) => {
  console.error(error);
});

req.write(data);
req.end();

那么问题来了:对于 application/x-www-form-urlencodedapplication/json 两种传参方式,它们的区别是什么呢?我们该如何选择?

回答

区别

application/x-www-form-urlencoded 是指在发送 HTTP POST 请求时,在请求头中使用 application/x-www-form-urlencoded 作为 Content-Type,请求体中是按照 key1=value1&key2=value2 的形式传递参数的。例如:

Content-Type: application/x-www-form-urlencoded

foo=bar&hello=world&key=value

application/json 是指在发送 HTTP POST 请求时,在请求头中使用 application/json 作为 Content-Type,请求体中是直接以 JSON 格式传递参数的。例如:

Content-Type: application/json

{
  "foo": "bar",
  "hello": "world",
  "key": "value"
}

如何选择

一般来说,如果要传递的参数数量较少,可以选用 application/x-www-form-urlencoded,如果参数较多或者参数的层次结构比较复杂,可以选用 application/json

此外,application/json 可以兼容更多类型的数据,而 application/x-www-form-urlencoded 只适用于表单数据,因此在传递一些复杂的数据结构而言,application/json 更具优势。

需要注意的是,使用 application/json 时,需要将参数转成 JSON 格式,而使用 application/x-www-form-urlencoded 时,则需要先将参数转成 Key-Value 形式,再使用 querystring.stringify() 方法将其转成字符串。

参考链接