Как закодировать или разрешить ответ модуля запроса в nodejs

#node.js #encoding #request #iconv #response-headers

#node.js #кодирование #запрос #iconv #ответ-заголовки

Вопрос:

Привет, я использую модуль запроса в 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("amp;");
}
 

данные имеют тип Json.

Когда я вызываю запрос, я получаю ответ с разорванной строкой. введите описание изображения здесь

итак, я добавил encoding: null, в запрос опцию post, например

 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-тег

Ответ №1:

Вы сделали запрос на публикацию. Итак, вы ОТПРАВЛЯЕТЕ данные на сервер. Вы не получите HTML-ответа. Вы получаете КОД ответа и соответствующие заголовки.

Если вместо этого вы использовали GET-запрос, то сервер мог бы отправить вам HTML-ответ. Увидеть, что я сказал, МОГ. Не обязательно будет. Вы можете получить JSON или просто код возврата, например.

В этом случае, хотя он отображается не полностью, вы можете увидеть код результата 200 в верхней части вашего изображения. Это говорит нам о том, что ваш запрос был выполнен успешно. А заголовки — это то, что вы перевели. Но соответствующая информация заключается в том, что сервер вернул код 200.

Так что или вы что-то ПОЛУЧАЕТЕ, или вы что-то ПУБЛИКУЕТЕ. Вы не можете получить HTML-код во время публикации. В сообщении вы отправляете данные в теле запроса, а затем получаете только полученный вами код результата или любой соответствующий код ошибки.

К вашему сведению, есть несколько других HTTP-методов, помимо POST и GET, но на данный момент остановитесь на этих 2, и когда вы действительно их поняли, вы посмотрите на другие.