【问题标题】:How to encode or resolve the response of request Module in nodejs如何在nodejs中编码或解析请求模块的响应
【发布时间】:2021-01-12 08:35:33
【问题描述】:

您好,我在 Nodejs 中使用请求模块。

下面有代码:

const response = await request.post({
  uri: "https://item.rms.rakuten.co.jp/rms/mall/rsf/item/vc",
  headers: {
    Host: "item.rms.rakuten.co.jp",
    Origin: "https://item.rms.rakuten.co.jp",
    Referer: "https://item.rms.rakuten.co.jp/rms/mall/rsf/item/vc",
    "Content-Type": "application/x-www-form-urlencoded",
    "Content-Length": buildForm(data).length,
    Cookie: cookies~,
    Accept:
      "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
    "Accept-Encoding": "gzip, deflate, br",
    "Accept-Language": "ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7,id;q=0.6",
    "Cache-Control": "max-age=0",
    Connection: "keep-alive",
    "sec-ch-ua": `"Google Chrome";v="87", " Not;A Brand";v="99", "Chromium";v="87"`,
    "sec-ch-ua-mobile": "?0",
    "Sec-Fetch-Dest": "document",
    "Sec-Fetch-Mode": "navigate",
    "Sec-Fetch-Site": "same-origin",
    "Sec-Fetch-User": "?1",
    "Upgrade-Insecure-Requests": 1,
    "User-Agent":
      "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36",
  },
  formData: buildForm(data),
})
const buildForm = (data) => {
  const keys = Object.keys(data);
  const form = [];

  for (let i = 0, l = keys.length; i < l; i++) {
    if (typeof data[keys[i]] === "string") {
      const data_value_buf = Buffer.from(data[keys[i]]);

      const data_value_convert = encoding.convert(
        data_value_buf,
        "EUCJP",
        "UTF8"
      );
      form.push(keys[i] + "=" + encoding.urlEncode(data_value_convert));
    } else if (typeof data[keys[i]] === "undefined") {
      form.push(keys[i] + "=" + "-");
    } else {
      form.push(keys[i] + "=" + data[keys[i]]);
    }
  }

  return form.join("&");
}

数据是Json类型。

当我调用请求时,我得到了损坏的字符串响应。

所以,我在请求发布选项中添加了encoding: null,,比如

const response = await request.post({
  uri: "https://item.rms.rakuten.co.jp/rms/mall/rsf/item/vc",
  encoding: null,
  headers: {
    Host: "item.rms.rakuten.co.jp",
~~~~

然后我使用 Iconv 模块。

const iconv = new Iconv("EUC-JP", "UTF-8//translit//ignore");
const res = iconv.convert(response);

如何在不损坏字符串的情况下显示响应
响应头也在下面

Cache-control: no-store, no-cache
Connection: close
Content-Encoding: gzip
Content-Type: text/html; Charset=EUC-JP
Date: Tue, 12 Jan 2021 05:28:50 GMT
Pragma: no-cache
Server: Apache
Transfer-Encoding: chunked
Vary: Accept-Encoding
X-Content-Type-Options: nosniff
X-frame-options: DENY
X-oracle-dms-ecid: 93mhk0e_y40000000
X-oracle-dms-rid: 0:1
X-XSS-Protection: 0

请告诉我如何获得像 html 标签响应这样的正常响应

【问题讨论】:

    标签: node.js encoding request iconv response-headers


    【解决方案1】:

    您提出了一个 POST 请求。所以你正在向服务器发送数据。您没有收到 HTML 响应。你会得到一个响应代码和相应的标题。

    如果您改为使用 GET 请求,则服务器可以向您发送 HTML 响应。看到我说可以。不一定会。例如,您可以获取 JSON,或者只是返回代码。

    在这种情况下,虽然它没有完全显示,但您可以在图像的顶部看到 200 结果代码。这告诉我们您的请求已成功。标题是您翻译的内容。但是相关信息是服务器返回了200码。

    所以或者你得到一些东西或者你发布一些东西。发布时无法获取 HTML。在帖子中,您发送请求正文中的数据,然后仅接收您收到的结果代码或任何相关的错误代码。

    仅供参考,除了 POST 和 GET 之外,还有其他几种 HTTP 方法,但暂时停留在这 2 种,当您真正理解它们时,您会查看其他方法。

    【讨论】:

      猜你喜欢
      • 2012-08-22
      • 2013-02-08
      • 1970-01-01
      • 2019-12-12
      • 2016-12-12
      • 2018-02-07
      • 1970-01-01
      • 2018-10-27
      • 2011-01-08
      相关资源
      最近更新 更多