JSON'u HTTP POST İsteğine geçir


92

Google QPX Express API [1] için nodejs ve istek [2] kullanarak bir HTTP POST isteği yapmaya çalışıyorum .

Kodum aşağıdaki gibi görünüyor:

    // 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)
        }
    })

Yapmaya çalıştığım şey, JSON'yi çok parçalı bağımsız değişken [3] kullanarak geçirmek. Ancak doğru JSON yanıtı yerine bir hata aldım (400 tanımsız).

Bunun yerine aynı JSON ve API Anahtarını kullanarak CURL kullanarak bir istekte bulunduğumda iyi çalışıyor. Yani API anahtarımda veya JSON'da yanlış bir şey yok.

Kodumun nesi var?

DÜZENLE :

çalışma CURL örneği:

i) İsteğime ileteceğim JSON'yi "request.json" adlı bir dosyaya kaydettim:

{
  "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) daha sonra, terminalde yeni oluşturulan request.json dosyasının bulunduğu dizine geçtim ve çalıştırdım (myApiKey açıkça benim gerçek API Anahtarım anlamına geliyor):

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] nodejs için tasarlanmış bir http istek istemcisi: https://www.npmjs.org/package/request [3] bulduğum bir örneği burada bulabilirsiniz https://www.npmjs.org/package/request#multipart-related [4] QPX Express API 400 ayrıştırma hatası döndürüyor


Removnig 'json: true' deneyin isteğinizden
Baart

bir fark yaratmaz. ama bildiğim kadarıyla bu yalnızca yanıtın bir json olduğunu belirtir değil mi?
Ronin

Çalışan cURL komut satırını gösterebilir misiniz?
mscdex

Merak ettiğim için neden çok parçalı kullanıyorsunuz?
cloudfeet

@mscdex lütfen güncellenmiş orijinal gönderime bakın
Ronin

Yanıtlar:


168

Aşağıdakilerin işe yaraması gerektiğini düşünüyorum:

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

Bu durumda Content-type: application/jsonbaşlık otomatik olarak eklenir.


1
Hangi nedenle olursa olsun, vurduğum uç nokta ilk yöntemi kullanarak parametreleri okuyamıyor (sanki gönderilmemiş gibi) ancak ikinci yöntemle bunu yapabiliyordu.
The Unknown Dev

Jamil'in söylediği gibi. SyntaxError: Unexpected token &quot;<br> &nbsp; &nbsp;at parse (/home/malcolm/complice/node_modules/body-parser/lib/types/json.js:83:15)İlk yöntemle aldım .
MalcolmOcean

@MalcolmOcean Bunun nedeni <br> etiketinin geçerli bir JSON içeriği olmaması
Tobi

Bu hatayı aldım: [ERR_STREAM_WRITE_AFTER_END]: write after endnasıl düzeltebilirim?
Mehdi Dehghani

18

Bunun üzerinde çok uzun süre çalıştım. Bana yardımcı olan cevap şuydu: node.js ile Content-Type: application / json post gönder

Aşağıdaki formatı kullanan:

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

10

Çok parçalı değil, Content-Type: application/jsonbunun yerine "düz" bir POST isteği (ile ) istiyorsunuz . İşte ihtiyacınız olan her şey:

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
});

Bunu denedim ama başka bir hata aldım: "400. Bu bir hata. Müşteriniz hatalı biçimlendirilmiş veya yasadışı bir istek gönderdi. Tüm bildiğimiz bu." tam yanıt için jsfiddle.net/f71opd7p adresini ziyaret edin lütfen
Ronin

4
Talep belgelerinde ve uygun @Tobi kodu , json: truegereken hem JSON.stringify() body ve JSON.parse() tepki.
mscdex

Cevap bu. Ayrıca yanıtı yönlendirebilirsinizrequest('xxx',{ json: true, body: req.body }).pipe(res).on('error', catchErr);
sidonaldson

Kabul edilen cevap olmadığında bu benim için çalıştı.
greg_diesel

Bu hatayı aldım: [ERR_STREAM_WRITE_AFTER_END]: write after endnasıl düzeltebilirim?
Mehdi Dehghani

9

Artık yeni JavaScript sürümüyle (ECMAScript 6 http://es6-features.org/#ClassDefinition ), nodejs ve Promise isteği kullanarak istek göndermenin daha iyi bir yolu var ( http://www.wintellect.com/devcenter/nstieglitz/5 -s6 uyumundaki harika özellikler )

Kitaplığı kullanma: https://github.com/request/request-promise

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

müşteri:

//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...
    });

sunucu:

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

Misal.

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);
});

Ekleme json: trueseçeneği olarak, gövdeyi değerin JSON gösterimine ayarlar ve "Content-type": "application/json"başlık ekler . Ayrıca, yanıt gövdesini JSON olarak ayrıştırır. BAĞLANTI


2

Dokümana göre: https://github.com/request/request

Örnek şudur:

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

Sanırım bir dizenin beklendiği bir nesneyi gönderiyorsunuz, değiştirin

body: requestData

tarafından

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

hissediyorum

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

Bu şekilde tanımlama, kodunuzu yazmanın etkili yolu olacaktır. Ve application / json otomatik olarak eklenmelidir. Özel olarak beyan etmeye gerek yoktur.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.