chuyển JSON sang HTTP POST Request


92

Tôi đang cố tạo yêu cầu HTTP POST tới API QPX Express của google [1] bằng cách sử dụng nodejsyêu cầu [2].

Mã của tôi trông như sau:

    // create http request client to consume the QPX API
    var request = require("request")

    // JSON to be passed to the QPX Express API
    var requestData = {
        "request": {
            "slice": [
                {
                    "origin": "ZRH",
                    "destination": "DUS",
                    "date": "2014-12-02"
                }
            ],
            "passengers": {
                "adultCount": 1,
                "infantInLapCount": 0,
                "infantInSeatCount": 0,
                "childCount": 0,
                "seniorCount": 0
            },
            "solutions": 2,
            "refundable": false
        }
    }

    // QPX REST API URL (I censored my api key)
    url = "https://www.googleapis.com/qpxExpress/v1/trips/search?key=myApiKey"

    // fire request
    request({
        url: url,
        json: true,
        multipart: {
            chunked: false,
            data: [
                {
                    'content-type': 'application/json',
                    body: requestData
                }
            ]
        }
    }, function (error, response, body) {
        if (!error && response.statusCode === 200) {
            console.log(body)
        }
        else {

            console.log("error: " + error)
            console.log("response.statusCode: " + response.statusCode)
            console.log("response.statusText: " + response.statusText)
        }
    })

Những gì tôi đang cố gắng làm là chuyển JSON bằng cách sử dụng đối số nhiều phần [3]. Nhưng thay vì phản hồi JSON thích hợp, tôi đã gặp lỗi (400 không xác định).

Thay vào đó, khi tôi thực hiện một yêu cầu bằng cách sử dụng cùng một JSON và Khóa API bằng CURL, nó hoạt động tốt. Vì vậy, không có gì sai với khóa API hoặc JSON của tôi.

Có gì sai với mã của tôi?

CHỈNH SỬA :

làm việc ví dụ CURL:

i) Tôi đã lưu JSON mà tôi sẽ chuyển cho yêu cầu của mình vào một tệp có tên "request.json":

{
  "request": {
    "slice": [
      {
        "origin": "ZRH",
        "destination": "DUS",
        "date": "2014-12-02"
      }
    ],
    "passengers": {
      "adultCount": 1,
      "infantInLapCount": 0,
      "infantInSeatCount": 0,
      "childCount": 0,
      "seniorCount": 0
    },
    "solutions": 20,
    "refundable": false
  }
}

ii) sau đó, trong terminal, tôi đã chuyển sang thư mục chứa và chạy tệp request.json mới được tạo (myApiKey rõ ràng là viết tắt của API Key thực tế của tôi):

curl -d @request.json --header "Content-Type: application/json" https://www.googleapis.com/qpxExpress/v1/trips/search?key=myApiKey

[1] https://developers.google.com/qpx-express/ [2] một ứng dụng khách yêu cầu http được thiết kế cho nodejs: https://www.npmjs.org/package/request [3] đây là một ví dụ tôi tìm thấy https://www.npmjs.org/package/request#multipart-osystem [4] QPX Express API đang trả về lỗi phân tích cú pháp 400


Hãy thử removnig 'json: true' từ yêu cầu của bạn
Baart

không tạo ra sự khác biệt. nhưng theo như tôi biết điều này chỉ xác định rằng phản hồi là một json phải không?
Ronin

Bạn có thể hiển thị dòng lệnh cURL hoạt động không?
mscdex

Vì tò mò, tại sao bạn lại sử dụng đa phần?
cloudfeet

@mscdex vui lòng xem bài đăng gốc được cập nhật của tôi
Ronin

Câu trả lời:


168

Tôi nghĩ những điều sau sẽ hoạt động:

// fire request
request({
    url: url,
    method: "POST",
    json: requestData
}, ...

Trong trường hợp này, Content-type: application/jsontiêu đề sẽ tự động được thêm vào.


1
Vì bất kỳ lý do gì, điểm cuối mà tôi đang nhấn không thể đọc các tham số bằng phương pháp đầu tiên (như thể chúng không được gửi) nhưng có thể làm như vậy với phương pháp thứ hai.
The Unknown Dev

Tương tự như những gì Jamil đã nói. Tôi có SyntaxError: Unexpected token &quot;<br> &nbsp; &nbsp;at parse (/home/malcolm/complice/node_modules/body-parser/lib/types/json.js:83:15)với phương pháp đầu tiên.
MalcolmOcean

@MalcolmOcean Đó là bởi vì một thẻ <br> không phải là một nội dung hợp lệ JSON
Tobi

Tôi gặp lỗi này:, [ERR_STREAM_WRITE_AFTER_END]: write after endlàm cách nào để khắc phục?
Mehdi Dehghani,

18

Tôi đã làm việc này quá lâu. Câu trả lời đã giúp tôi là: gửi Content-Type: application / json post với node.js

Sử dụng định dạng sau:

request({
    url: url,
    method: "POST",
    headers: {
        "content-type": "application/json",
        },
    json: requestData
//  body: JSON.stringify(requestData)
    }, function (error, resp, body) { ...

10

Bạn không muốn nhiều phần mà Content-Type: application/jsonthay vào đó là một yêu cầu POST "đơn giản" (với ). Đây là tất cả những gì bạn cần:

var request = require('request');

var requestData = {
  request: {
    slice: [
      {
        origin: "ZRH",
        destination: "DUS",
        date: "2014-12-02"
      }
    ],
    passengers: {
      adultCount: 1,
      infantInLapCount: 0,
      infantInSeatCount: 0,
      childCount: 0,
      seniorCount: 0
    },
    solutions: 2,
    refundable: false
  }
};

request('https://www.googleapis.com/qpxExpress/v1/trips/search?key=myApiKey',
        { json: true, body: requestData },
        function(err, res, body) {
  // `body` is a js object if request was successful
});

Tôi đã thử cách này nhưng gặp lỗi khác: "400. Đó là một lỗi. Khách hàng của bạn đã đưa ra một yêu cầu không đúng định dạng hoặc bất hợp pháp. Đó là tất cả những gì chúng tôi biết." để có câu trả lời đầy đủ, vui lòng truy cập jsfiddle.net/f71opd7p
Ronin

4
@Tobi theo tài liệu yêu cầu và , json: truenên cả hai JSON.stringify() body JSON.parse() phản hồi.
mscdex

Đây là câu trả lời. Hơn nữa để nó, bạn cũng có thể ống phản ứngrequest('xxx',{ json: true, body: req.body }).pipe(res).on('error', catchErr);
sidonaldson

Điều này làm việc cho tôi khi câu trả lời được chấp nhận là không.
greg_diesel

Tôi gặp lỗi này:, [ERR_STREAM_WRITE_AFTER_END]: write after endlàm cách nào để khắc phục?
Mehdi Dehghani,

9

Giờ đây với phiên bản JavaScript mới (ECMAScript 6 http://es6-features.org/#ClassDefinition ), có một cách tốt hơn để gửi yêu cầu bằng nodejs và yêu cầu Promise ( http://www.wintellect.com/devcenter/nstieglitz/5 -great-features-in-es6-hài hòa )

Sử dụng thư viện: https://github.com/request/request-promise

npm install --save request
npm install --save request-promise

khách hàng:

//Sequential execution for node.js using ES6 ECMAScript
var rp = require('request-promise');

rp({
    method: 'POST',
    uri: 'http://localhost:3000/',
    body: {
        val1 : 1,
        val2 : 2
    },
    json: true // Automatically stringifies the body to JSON
}).then(function (parsedBody) {
        console.log(parsedBody);
        // POST succeeded...
    })
    .catch(function (err) {
        console.log(parsedBody);
        // POST failed...
    });

người phục vụ:

var express = require('express')
    , bodyParser = require('body-parser');

var app = express();

app.use(bodyParser.json());

app.post('/', function(request, response){
    console.log(request.body);      // your JSON

    var jsonRequest = request.body;
    var jsonResponse = {};

    jsonResponse.result = jsonRequest.val1 + jsonRequest.val2;

    response.send(jsonResponse);
});


app.listen(3000);

3

Thí dụ.

var request = require('request');

var url = "http://localhost:3000";

var requestData = {
    ...
} 

var data = {
    url: url,
    json: true,
    body: JSON.stringify(requestData)
}

request.post(data, function(error, httpResponse, body){
    console.log(body);
});

json: truetùy chọn chèn , đặt nội dung thành biểu diễn JSON của giá trị và thêm "Content-type": "application/json"tiêu đề. Ngoài ra, phân tích cú pháp nội dung phản hồi dưới dạng JSON. LIÊN KẾT


2

Theo doc: https://github.com/request/request

Ví dụ là:

  multipart: {
      chunked: false,
      data: [
        {
          'content-type': 'application/json', 
          body: JSON.stringify({foo: 'bar', _attachments: {'message.txt': {follows: true, length: 18, 'content_type': 'text/plain' }}})
        },
      ]
    }

Tôi nghĩ rằng bạn gửi một đối tượng mà một chuỗi được mong đợi, hãy thay thế

body: requestData

bởi

body: JSON.stringify(requestData)

2
       var request = require('request');
        request({
            url: "http://localhost:8001/xyz",
            json: true,
            headers: {
                "content-type": "application/json",
            },
            body: JSON.stringify(requestData)
        }, function(error, response, body) {
            console.log(response);
        });

0

tôi cảm thấy

var x = request.post({
       uri: config.uri,
       json: reqData
    });

Định nghĩa như vậy sẽ là cách hiệu quả để viết mã của bạn. Và ứng dụng / json sẽ được tự động thêm vào. Không cần thiết phải khai báo cụ thể.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.