2016-04-07 4 views
2

社内で作られた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の非同期呼び出しに変更しようとしましたが、その場合はすべて正常に動作します。エラーオブジェクトのheaderscontentにアクセスし、正しく解析します。

私の質問は:{ [Error: failed [400] {"original_response": "here"}] stack: [Getter] }の周りに応答がラップされている理由と、この場合正しくエラーを解析する方法ですか? Meteorが誤ったレスポンスを受け取ったときにexcオブジェクトを適切に構築するために、どこかのヘッダー(サーバーまたはMeteorアプリ)が欠落していますか?

+0

流星は、エラーがスローされます...、さまざまな方法で例外をラップしています4xx/5xx応答の場合、サーバーの応答はエラー内にあり、エラー文字列を解析してJSONデータを取得できます。ドキュメントをチェックすると、非同期コールバックを使用してもエラーがスローされないようですが、おそらく結果を得ることができます:http://docs.meteor.com/#/full/http – ojovirtual

+0

ああ、我々は、非同期呼び出しを使用して、私はこの情報で私のポストを更新します:) – errata

答えて

1

まあ、私の場合には、例外中のオブジェクトは現在exc.responseにアクセスできるように明らかに流星V1.3があるとき