在python中使用请求循环分页的RESTAPI

在python中使用请求循环分页的RESTAPI,python,rest,api,loops,python-requests,Python,Rest,Api,Loops,Python Requests,我是RESTAPI、请求和python的一个非常没有经验的用户,所以请容忍我。我已经设法通过python使用请求向这个由Postman开发的RESTAPI抛出GET请求。我得到的结果很好,但只有第一页(只有50项)。我知道,为了获得更多结果,我需要做的就是在URL中添加“?page=2”等等,但不知何故,到目前为止,我无法管理循环。在我看来,这个API没有“nextUrl”或总页数功能,所以我有点迷路了。这就是我到目前为止所做的: from getpass import getpass impo

我是RESTAPI、请求和python的一个非常没有经验的用户,所以请容忍我。我已经设法通过python使用请求向这个由Postman开发的RESTAPI抛出GET请求。我得到的结果很好,但只有第一页(只有50项)。我知道,为了获得更多结果,我需要做的就是在URL中添加“?page=2”等等,但不知何故,到目前为止,我无法管理循环。在我看来,这个API没有“nextUrl”或总页数功能,所以我有点迷路了。这就是我到目前为止所做的:

from getpass import getpass
import requests


usr = input('Inform user: ')
pwd = getpass('Inform password : ')


url = 'https://api.inventsys.com.br/v4/login'
payload = "{\n  \"username\": \"" + usr + "\",\n  \"password\": \"" + pwd + "\"\n}"
headers = {
      'Account': 'my-user',
      'Content-Type': 'application/json',

    }
r = requests.request('POST', url, headers = headers, data = payload, allow_redirects=False)

mytoken = r.json()['token']

projectid = input('Inform project ID (10762): ')

url = 'https://api.inventsys.com.br/v4/projects/'+projectid+'/items'
payload = {}
headers = {

      'Account': 'my-user',
      'Token': mytoken,

    }

ativos = requests.request('GET', url, headers = headers, data = payload, allow_redirects=False)


print(ativos.json()['result'])


print(ativos.text)
print(ativos.headers)
它提供了以下结果(我缩短了结果,因此它只显示了50条记录中的一条):

如何通过循环获得所有1505个项目?
非常感谢

由于我们不知道页数(可用的
projectid
),您可以使用
try&except
,如下所示:

projectid = 0 # initiate value for projectid
while True:
    try:
        url = 'https://api.inventsys.com.br/v4/projects/'+projectid+'/items'
        ativos = requests.request('GET', url, headers=headers, data=payload, allow_redirects=False)
        # do any thing with ativos
    except HTTPError:
        # handle HTTPError
        logging.error('HTTPError')
    # ... put any other Exception you need to handle here
    except Exception as e:
        # for handle unknown exception
        logging.error('Unknown exception')
    else:
        # loop over projectid
        projectid += 1

由于我们不知道页数(可用的
projectid
),您可以使用
try&except
,如下所示:

projectid = 0 # initiate value for projectid
while True:
    try:
        url = 'https://api.inventsys.com.br/v4/projects/'+projectid+'/items'
        ativos = requests.request('GET', url, headers=headers, data=payload, allow_redirects=False)
        # do any thing with ativos
    except HTTPError:
        # handle HTTPError
        logging.error('HTTPError')
    # ... put any other Exception you need to handle here
    except Exception as e:
        # for handle unknown exception
        logging.error('Unknown exception')
    else:
        # loop over projectid
        projectid += 1

这个答案假设您使用
projectid
循环浏览页面,如果您使用其他变量进行迭代,只需将
projectid
替换为该变量即可。像这样使用
除异常
是不好的做法。确切地说,当我们捕获任何异常时,我们需要处理它,但我不是为了简单才把它放在这里的。我能做的最多的就是猜测你到底想抓住哪个例外。另外,请看。谢谢你的建议,我已经阅读了一些投票率最高的答案,我没有发现与我上面的答案有任何冲突。可能print语句中的消息没有意义。此答案假设您使用
projectid
循环页面,如果您使用其他变量进行迭代,只需用该变量替换
projectid
。像这样使用
Exception
是不好的做法。当我们捕获任何异常时,我们需要处理它,但为了简单起见,我没有将其放在这里。我所能做的最多就是猜测您实际要捕获的异常。另外,请看。谢谢你的建议,我已经阅读了一些投票率最高的答案,我没有发现与我上面的答案有任何冲突。也许print语句中的信息没有意义。听起来你正走在正确的道路上,完成了你想做的事情。您只需要找到API控制响应数据分页的方法,听起来您正走在正确的道路上,以完成您正试图做的事情。您只需要找到API控制响应数据分页的方法。