Проблема с разбиением на страницы вызовов API PythonPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Проблема с разбиением на страницы вызовов API Python

Сообщение Anonymous »

Я застрял в следующем вопросе: у меня есть приведенный ниже код для вызова API. Сам по себе вызов API в порядке, проблем с сервером нет, я проверил в Postman:

Код: Выделить всё

{
"@odata.context": "https://api.channeladvisor.com/v1/$metadata#Orders",
"value": [
{....}
],
"@odata.nextLink": "https://api.channeladvisor.com/v1/Orders?refresh_token=xxx&$skip=100"
}
Я новичок во всем этом, поэтому, пожалуйста, потерпите. Все, что я хочу сделать, это сохранить все записи в фрейме данных в конце, а не только первые 100 записей. Документация Channel Advisor также не очень полезна, и я не смог найти то, что мне нужно, при поиске в Google.
Я нашел здесь сообщение, которое хотел добавить в Цикл while, и мне пришлось изменить его в соответствии со своими требованиями.
Версия кода 1 (полная):

Код: Выделить всё

import requests
import pandas as pd
import os
import json

def get_access_token():
url = 'https://api.channeladvisor.com/oauth2/token'
headers = {'Authorization': 'Basic xxxxx'}
post_body = {'grant_type': 'refresh_token', 'refresh_token': 'xxxxx'}
response = requests.post(url, headers=headers, data=post_body)
return response.json()['access_token']

access_token = get_access_token()

url = 'https://api.channeladvisor.com/v1/orders'
headers = {
'Authorization': 'bearer ' + access_token,
'accept': 'text/plain',
'Content-Type': 'application/json'
}

response = requests.get(url, headers=headers)
response_data = response.json()['value']
response_nextlink = response.json()['@odata.nextLink']

#create list to store the values
data = []
data.extend(response_data)

while True:
if '@odata.nextLink' in response_nextlink:
response = requests.request('GET', response_data['@odata.nextLink'], headers=headers)
response_data = response.json()['value']
data.extend(response_data['value'])
response_nextlink = response.json()['@odata.nextLink']
else:
break
Этот код выполняется только один раз, вероятно, потому, что цикл while настроен неправильно.
Итак, я добавил некоторую обработку ошибок:
Версия кода 2:

Код: Выделить всё

while True:
response = requests.get(url, headers=headers)
if response.status_code != 200:
print("Error occurred. Status code: ", response.status_code)
print("Content: ", response.content)
break
response_data = response.json().get('value')
if not response_data:
break
data.extend(response_data)
if '@odata.nextLink' in response.json():
url = response.json()['@odata.nextLink']
else:
break
Результатом этого является ошибка выполнения с кодом состояния 400. Опять же, с сервером все в порядке, когда я пытаюсь вызвать Postman.
Итак, я снова изменил цикл while:
Версия кода 3:

Код: Выделить всё

while True:
response = requests.get(url, headers=headers)
response_data = response.json()['value']
data.extend(response_data)
if '@odata.nextLink' in response.json():
url = response.json()['@odata.nextLink']
else:
break
Это приводит к следующей ошибке:

Код: Выделить всё

---------------------------------------------------------------------------
JSONDecodeError                           Traceback (most recent call last)
Input In [80], in ()
24 while True:
25     response = requests.get(url, headers=headers)
---> 26     response_data = response.json()['value']
27     data.extend(response_data)
28     if '@odata.nextLink' in response.json():

...................

JSONDecodeError: Expecting value: line 1 column 1 (char 0)
В остальном я застрял. Что я делаю не так?

Подробнее здесь: https://stackoverflow.com/questions/756 ... tion-issue
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»