APIからデータにアクセスする必要があるプログラムがあります。私はそれからリストを取得する必要があり、その後、そのリスト内のすべてのアイテムについて、APIからより多くのデータを要求します。私はリストを取得すると、このリストに約600アイテムがあるとき、それらを50のバッチで取得します。私はリクエストとスレッドを使ってこれを行うことができると思った。私はAPIを呼び出すために、本質的にヘルパーメソッドを持っている私のPythonスレッド同士がリクエストをかけ合っているのですか?
:ここでのように見えるものです
call_api_method(method, token, params={}):
params_to_send = params.copy()
params_to_send['auth'] = token
response = requests.get('{0}/rest{1}'.format(DOMAIN, method), params = params_to_send)
return response.json()
私はその後、すべての情報を取得するために再帰スレッディング機能を持っています。
def import_item_info(auth_token, start = None):
if start is None:
start = 0
threads = []
result = call_api_method('get_list', auth_token, {'start': start})
#the call returns next which is the index of the next batch
if result['next']:
thread = threading.Thread(target=import_item_info, args=(auth_token, result['next'])
thread.start()
threads.append(thread)
for list_item in result['result']:
thread = threading.Thread(target=get_item_info, args=(auth_token, item['ID'])
thread.start()
threads.append(thread)
for thread in threads:
thread.join()
これはget_item_infoで、アイテムのIDを使用して、APIを呼び出します:私は、アイテムごとに情報を要求するためにスレッドをしながら、私は先に行くためにスレッドを使用し、情報の次のバッチを要求することができると思いました項目についての具体的な詳細を取得するために:私はたくさんの情報を抽象化しましたが、基本的に何が起こっている
def get_item_info(auth_token, item_id):
item = call_api_method('get_item', auth_token, {'id': item_id})
print(item['key'])
することは時々requests.getは少し文字化け何かを返し、私はJSONDecodeErrorを得ることです:期待します値:行1列1(char 0)。
私はこれが最初の要求がうまくいっているので、これがスレッドの問題であると非常に疑います。私が間違っていることを見つけることができない。
実際のURLは何ですか?スレッドなしで 'get_item_info'を試しましたか?あなたは同じ問題を抱えましたか?あなたは 'response.text'や' response.content'を印刷して何を得るのか見ましたか?たぶん有用な情報が得られるかもしれません。APIが警告を送るか、ネットワークに別の問題があるかもしれません。ウェブブラウザで直接テストするために完全なURLを印刷しましたか?たぶんあなたはWebブラウザでも動作しないURLを作成します。 – furas
get_item_infoはスレッドなしで完璧に動作します。それに問題はない。私はそのアイテムとそのアイテムのキーを印刷しました。フルURLもうまく機能します。 実際のURLは何ですか:それは当社のクラウドCRMです。 –