使用node.js处理内容类型为application / json的服务器响应

我有一个服务器针对CURL请求curl --insecure -i -F files=@test.png https://xxx.xx.xx.xxx/powerai-vision/api/dlapis/b06564c9-7c1e-4642-a5a6-490310563d49返回以下内容。

HTTP/1.1 200 OK
Server: nginx/1.15.5
Date: Mon,04 Nov 2019 06:23:14 GMT
Content-Type: application/json
Content-Length: 3556
Connection: keep-alive
Vary: accept-Encoding
X-Powered-By: Servlet/3.1
access-control-allow-origin: *
access-Control-Allow-Headers: X-Auth-Token,origin,content-type,accept,authorization
access-Control-Allow-Credentials: true
access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS,HEAD
Content-Language: en
X-Frame-Options: SAMEORIGIN
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
strict-transport-security: max-age=15724800; includeSubDomains
{"webAPIId":"b06564c9-7c1e-4642-a5a6-490310563d49","imageUrl":"http://powerai-vision-service:9080/powerai-vision-api/uploads/temp/b06564c9-7c1e-4642-a5a6-490310563d49/58c6eb6a-aaa4-4d6b-8c20-aadec4558107.png","imageMd5":"bd123739171d95d30d570b2cd0ed1aed","classified":[{"confidence":0.997600257396698,"ymax":997,"label":"white_box","xmax":1407,"xmin":1166,"ymin":760,"attr":[{}]},],"result":"success"}

我想使用node.js来构建一个Web应用程序来处理它并在最后获取json字符串。为此,我正在使用以下代码。

'use strict';
/* eslint-env node */

const express = require('express');
const request = require('request');
const MISSING_ENV =
  'Missing required runtime environment variable POWERAI_VISION_WEB_API_URL';

require('dotenv').config({
  silent: true,});

const app = express();
const port = process.env.PORT || process.env.VCAP_APP_PORT || 8081;
const poweraiVisionWebApiUrl = process.env.POWERAI_VISION_WEB_API_URL;

console.log('Web API URL: ' + poweraiVisionWebApiUrl);

if (!poweraiVisionWebApiUrl) {
  console.log(MISSING_ENV);
}

app.use(express.static(__dirname));
app.use(express.json());

app.post('/uploadpic',function (req,result) {
  if (!poweraiVisionWebApiUrl) {
    console.log(MISSING_ENV);
    result.send({ data: JSON.stringify({ error: MISSING_ENV }) });
  } else {
    req.pipe(request.post({
      url: poweraiVisionWebApiUrl,agentOptions: {
        rejectUnauthorized: false,}
    },function (err,resp,body) {
      if (err) {
        console.log(err);
      }
      console.log('Check 22');
      console.log(body);
      // console.log(JSON.parse(body).webAPIId);
      result.send({ data: body });
    }));
  }
});

app.listen(port,() => {
  console.log(`Server starting on ${port}`);
});

我遇到的问题是我不知道如何访问正文中的元素(json强)。现在console.log(body)打印出垃圾(https://github.com/IBM/powerai-vision-object-detection/issues/61)。在node.js中处理此字符串的正确方法是什么?

我是Node.js编程的新手。

当我打印响应的标题时,得到以下输出。

{
server: 'nginx/1.15.5',date: 'Tue,05 Nov 2019 02:47:37 GMT','content-type': 'application/json','transfer-encoding': 'chunked',connection: 'keep-alive',vary: 'accept-Encoding','x-powered-by': 'Servlet/3.1','access-control-allow-origin': '*','access-control-allow-headers': 'X-Auth-Token,authorization','access-control-allow-credentials': 'true','access-control-allow-methods': 'GET,HEAD','content-language': 'en','x-frame-options': 'SAMEORIGIN','x-content-type-options': 'nosniff','x-xss-protection': '1; mode=block','strict-transport-security': 'max-age=15724800; includeSubDomains','content-encoding': 'gzip'
}

看起来内容编码是gzip。为什么向外卷曲和node.js响应不同?我应该如何处理gzip内容?有链接吗?

xuzhihua131792 回答:使用node.js处理内容类型为application / json的服务器响应

看起来您正在正确解析JSON。

但是在查看了您在github上发布的屏幕截图之后,似乎您的正文中有二进制文件而不是JSON(也许是图像?)。 如果是我,我将检查您是否正在调用API发送正确的参数。

更新:

看到标头后,看起来响应仍然是gzip压缩的,这可以解决您的问题:https://gist.github.com/miguelmota/9946206

curl可能会自动为您执行此操作,这就是为什么您看到纯json的原因,或者可能是因为curl请求具有标头集,告诉服务器不要使用gzip

更新2:

尝试通过添加gzip: true发出请求,它应该为您做所有事情

 req.pipe(request.post({
   url: poweraiVisionWebApiUrl,gzip: true,agentOptions: {
       rejectUnauthorized: false,}
   },function (err ...)
本文链接:https://www.f2er.com/3163166.html

大家都在问