2016-04-26 14 views
2

を要求します。再試行は、私は以下の再試行のために必要としている

最近APIが

不完全なデータ以下のような不完全なデータを返します。

{ 
offerInfo: { 
siteID: "001", 
language: "en_US", 
currency: "USD" 
}, 
userInfo: { 
persona: { 
personaType: "OTHERS" 
}, 
userId: "111" 
}, 
offers: { } 
} 

完全なデータ:

{ 
offerInfo: { 
siteID: "001", 
language: "en_US", 
currency: "USD" 
}, 
userInfo: { 
persona: { 
personaType: "OTHERS" 
}, 
userId: "111" 
}, 
offers: { 
Flight: [ 
{ 
offerDateRange: { 
travelStartDate: [ 
2016, 
5, 
7 
], 
travelEndDate: [ 
2016, 
5, 
11 
] 
}}} 

完全な応答は、[ '申し出'] [ 'フライト' を持つ必要があります]キーを押してください。そうでない場合は、&を次のAPI URLに移動する前に、自分のコードがAPIをN回呼び出すようにしてください。

私はセッションで、以下のコードをしようと、私は[「申し出」] [「フライト」]

注それにチェックを追加する方法を確認していない:何のHTTPエラーはありません不完全なデータが返さ取得中APIから、私はコメントで提案ループプラスカウントとしてながらキー[「申し出」] [「フライト」]

session = requests.Session() 
session.mount("http://", requests.adapters.HTTPAdapter(max_retries=2)) 
session.mount("https://", requests.adapters.HTTPAdapter(max_retries=2)) 
try: 
    response = session.get(url=line,timeout=(connect_timeout,read_timeout),verify=False) 
+3

ループを追加しますか?あなたが正しいデータを持っているか、あなたが何度も試してみたときに 'True:...'と 'break' –

答えて

1

Aに依存する必要は単純な答えであると十分に良いかもしれません。

代わりに、この種のものに該当するモジュールを使用したい場合は、backoffは、設定可能なバックオフ動作で再試行する機能を装飾するライブラリです。特に、on_predicateデコレータを使用すると、指定した関数の戻り値に基づいて再試行の基準を定義できます。

import backoff 

def has_flight_offer(dct): 
    return 'Flight' in dct.get('offers') 

@backoff.on_predicate(backoff.constant, has_flight_offer, max_tries=3, interval=1) 
def get_offers(session, url)) 
    response = session.get(url, verify=False) 
    return response.json() 

また例外で再試行を処理し、あなたが同様の装飾とそれにいる間、あなたは要求の例外を処理するためにそれを使用することができますので、それは、リクエストとよく果たしています。

@backoff.on_predicate(backoff.constant, has_flight_offer, max_tries=3, interval=1) 
@backoff.on_exception(backoff.expo, requests.exceptions.RequestException, max_tries=3) 
def get_offers(session, url)) 
    response = session.get(url, verify=False) 
    return response.json()