自社製の RESTful API を呼び出す Meteor アプリを開発しています。サーバーは、"Content-type: application/json"
ヘッダーが設定されていることを想定しており、ステータス コードに関係なく、常に同じヘッダー ( Content-Type: application/json; charset=UTF-8
) と JSON 形式の本文で応答します。
いくつかの例:
# 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"
}
Meteor では、次のようなメソッドを使用して 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] }
ているのですか?この場合、エラーを適切に解析する方法は? exc
Meteorが誤った応答を受け取ったときにオブジェクトを適切に構築するために、どこか (サーバーまたは Meteor アプリ) にヘッダーがありませんか?