社内で作られたRESTful APIを呼び出すMeteorアプリケーションを開発しています。私たちのサーバーは、"Content-type: application/json"
ヘッダーが設定されていると予想し、ステータスコードに関係なく、常に同じヘッダー(Content-Type: application/json; charset=UTF-8
)とJSON形式の本文で応答します。Meteorで誤ったサーバーの応答を解析する
いくつかの例:流星で
# SERVER RESPONDED WITH 200:
HTTP/1.1 200 OK
Content-Length: 338
Content-Type: application/json; charset=UTF-8
Date: Thu, 07 Apr 2016 10:44:33 GMT
Server: nginx
{
"result": "Hello, world!",
"status": "OK"
}
# RESPONSE WITH SOME ERRORS:
HTTP/1.1 400 Bad Request
Content-Length: 547
Content-Type: application/json; charset=UTF-8
Date: Thu, 07 Apr 2016 10:23:49 GMT
Server: nginx
{
"errors": [
{
"description": "error desc.",
"location": "error location",
"name": "error name"
}
],
"status": "error"
}
、我々はAPIを呼び出すために、このようなメソッドを使用している:
let url = 'https://server.url/path';
var auth = "user:pass";
var headers = {"Content-type": "application/json"};
let objId = 100;
let report_type = 'some_type';
let data = {
object_id: objId,
report_type: report_type
};
let payload = {auth, headers, data};
try {
var result = HTTP.post(url, payload);
} catch (exc) {
console.log(exc);
return exc;
}
return result;
サーバが4xxの/ 5xxのエラーで応答したときに、ここで問題があり、exc
オブジェクトは適切なJSONフォーマットのオブジェクトではありませんが(これはMeteor 1.2と1.3で試していますが)、次のようになります:
{ [Error: failed [400] {"errors": [{"description": "error desc.", "location": "error location", "name": error name"}], "status": "error"}] stack: [Getter] }
応答が200の場合、result
は適切なJSONオブジェクトであり、問題なく解析できます。
サーバ呼び出しをMeteorの非同期呼び出しに変更しようとしましたが、その場合はすべて正常に動作します。エラーオブジェクトのheaders
とcontent
にアクセスし、正しく解析します。
私の質問は:{ [Error: failed [400] {"original_response": "here"}] stack: [Getter] }
の周りに応答がラップされている理由と、この場合正しくエラーを解析する方法ですか? Meteorが誤ったレスポンスを受け取ったときにexc
オブジェクトを適切に構築するために、どこかのヘッダー(サーバーまたはMeteorアプリ)が欠落していますか?
流星は、エラーがスローされます...、さまざまな方法で例外をラップしています4xx/5xx応答の場合、サーバーの応答はエラー内にあり、エラー文字列を解析してJSONデータを取得できます。ドキュメントをチェックすると、非同期コールバックを使用してもエラーがスローされないようですが、おそらく結果を得ることができます:http://docs.meteor.com/#/full/http – ojovirtual
ああ、我々は、非同期呼び出しを使用して、私はこの情報で私のポストを更新します:) – errata