2016-11-01 14 views
0

私はいくつかのjsonデータを取得するためにAPI呼び出しを使用していますが、ユーザーのIDに基づいて異なるデータを返す複数のIDを使用して呼び出しを実行するforループを使用しています。そうAPIエラー処理

{"result":{"elements":[{"id":"dslkjafsadl","name":"Test","ownerId" 
:"sdfadfsfsda","lastModified":"2016","isActive":true}, 
{"id":"dsafsad","name":"Test","ownerId":"sdfasdfa","lastModified":"2016","isActive":true}],"nextPage":null},"meta":{"httpStatus":"200 - OK","requestId":"3242343"}} 

:権限を持つユーザーのための

{"meta":{"httpStatus":"401 - Unauthorized","error":{"errorMessage":"Insufficient 
permissions.","errorCode":"ARH_8.5"},"requestId":null}} 

と、この:JSONデータがやや権限のないユーザーのために次のようになりますので、だから、基本的に我々は我々のユーザーの一部の権限を更新する必要があります私の質問は、もし私がアクセス権の有無にかかわらず多くの結果を持つ大きな応答を持っていれば、どのように私はアクセス権を持つユーザーからIDを引き出し、アクセス権なしでIDを除外できますか?私が受け取るこのコードから

requestId = request_id = [element['requestId'] for element in data['result']['elements']] 

は、応答を変数に「データ」が格納されていると私は探していますIDは、これは私が試したコードである「requestId」に保存されますと言いますTypeErrorを返し、最初の応答が正しいアクセス権を持たないユーザーであるため '結果'を認識しません。

+0

ベストな方法は、元の要求からのHTTPステータスコードをチェックすることです。'requests'オブジェクトの' status_code'に許可が拒否された '401'が含まれるように、' requested'ライブラリを使ってGETを実行するとします。他のライブラリを使用することもできます。他のすべてが失敗した場合は、本体を使用して 'x ['meta'] ['httpStatus'] value'をチェックすることができます。 – sal

答えて

1

あなたはJSONを管理している場合:

は、1つの可能な解決法は、返される結果の権限について説明し、親ノードがあることを、あなたのJSONは、このようなconsturctことであろう。例えば:この設定で

{"permissions": false, 
    {"meta":{"httpStatus":"401 - Unauthorized","error": 
    {"errorMessage":"Insufficient permissions.","errorCode":"ARH_8.5"}, 
    "requestId":null} 
    } 
} 

そして

{"permissions": true, 
{"result":{"elements":[{"id":"dslkjafsadl","name":"Test","ownerId" 
:"sdfadfsfsda","lastModified":"2016","isActive":true},{" 
id":"dsafsad","name":"Test","ownerId":"sdfasdfa","la 
stModified":"2016","isActive":true}],"nextPage":null},"meta":{"h 
ttpStatus":"200 - OK","requestId":"3242343"}}} 

、ちょうど最初の値を読み、それに応じてあなたのJSON-解析するコードを構造化します。あなたは、JSONをコントロールしていない場合は

は:

この場合は、あなたはどのあなたが本当にそれを処理することができます前に、あなたが受けている要求を把握する必要があります。これを行う1つの方法は、トップキーの名前を読み取ることです。正しい応答の場合

は、あなたがこのような何かを行うことができます:

parsed_json = json.loads(json_string) 
# The key "result" is only in the sucess response, not in the error response 
if "result" in parsed_json: 
    # Success 
else: 
    # Error 
+0

申し訳ありませんが、どうすればいいですか?私はPythonの初心者です。 –

+0

多分私はあなたの質問に誤解しました。あなたが受け取っているjsonを制御できますか? – nmg49

+0

私は単純にapi呼び出しでjsonを取得するためのパラメータとしてユーザーIDを使用していません –

2

ベストな方法は、元の要求からHTTPステータスコードをチェックすることです。 requestsライブラリを使用してGETを実行すると、要求オブジェクトのstatus_codeには許可が拒否されたため401が含まれます。ちょうどあなたが既に持っているコードに頼る

、あなたに条件文を含めることができます。

基本的にのみ 「メタ」要素がかかります
requestId = request_id = [element['requestId'] for element in data['result']['elements'] if element.get('meta').get('httpStatus') == '200 - OK'] 

「はhttpStatusは」希望1です。 requestsライブラリの

は、ここで見てみましょう: http://docs.python-requests.org/

+0

ありがとう、私はサラの方法を使用して終了しましたが、あなたのコンセプトを把握するのに役立ちました。 –