2017-03-09 86 views
0

我有腳本中調用API。腳本然後使用來自api調用的信息。我認爲這個問題是有時劇本上,而無需等待從API調用的響應動作。這裏的原因,我認爲是這樣的話:API調用不返回預期值,腳本繼續

例1:我有一個腳本(cs.py),其獲取與API調用貨幣轉換率,並做一些其他的東西。有時當我運行這個腳本時,我得到一個如下所示的錯誤。
aud_to_usd = requests.get(' http://api.fixer.io/latest?base=AUD&symbols=USD ').json()['rates']['USD'] ... json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

實施例2:我有一個腳本,需要發票和或者使用蒂卡提取文本(如果文本是可搜索的)或使用谷歌視力OCR API提取文本。最終結果是被格式化並輸出到電子表格中的文本。 有時只有來自tika調用的文本出現在電子表格中,來自google api調用的信息不會通過。

如果我在ipython中逐步運行腳本(例如,將每個api調用單獨粘貼到終端並等待響應),腳本就可以工作。另外(正如我使用「有時候」這個詞所暗示的),有時候只是運行整個腳本。

這似乎將是一個常見的問題。我說得對,api電話只是花了太長時間,劇本正在繼續?有沒有辦法讓腳本等待,直到提供響應?例如,一試,只是試圖API調用,等待一定的時間,然後重新嘗試調用,如果沒有反應?

(SO告訴我,不要使用標籤「API」,但我想不出更恰當的標籤......)

回答

0

你是在正確的軌道上。你可以做這樣的事情:

exch_rate = None while not exch_rate: try: resp = requests.get('http://api.fixer.io/latest?base=AUD&symbols=USD') resp.raise_for_status() exch_rate = resp.json() except: time.sleep(5)

您也可以防止超時,像這樣:requests.get('http://github.com', timeout=0.001)

很明顯,我會建議想逃出來while循環之後的幾次失敗的嘗試:-)

+0

我認爲如果您在嘗試失敗後進行睡眠呼叫,它會很友好(並且可能避免讓您禁止使用其API)。 – Neil

+0

好主意!加入 –