从 postman 与 python API 调用获得不同的响应

问题描述 投票:0回答:1

我正在尝试使用 Python 从 Postman 中的 API 调用获取相同的数据。

通话比较简单。它使用基本授权,只需要 API 密钥作为用户名传递,以及动态组件:从早期代码传递的 csv_key 变量。

我能够成功发出请求(状态代码 200),但 Python 的响应与 Postman 中的响应不同。除了前两个:id 和description 之外,它缺少所有键值对。

我收到邮递员的回复: 邮递员的回复

    {
    "id": "63c9c0927885bf003ecd3a1b",
    "description": "Streaming analytics",
    "download_url": "https://storage.googleapis.com/***-static/***.csv?GoogleAccessId=888211540537-r3m40kms2upicdr07e5rl2q67feg9loh%40developer.gserviceaccount.com&Expires=4070908800&Signature=WvuuKdddCFKjSNpst5n8yKFNR5qtC1m1o1mQZFWLHmKomJtc7npa6PbwfRoTj9FhIIqbta98VPOYKMGW89XaqXtITh15V%2Bf9opAD3BnuLjTzWC6X24RC5kMCZATXpp9DWi1Our061%2FdKlpUozi1ir7b8AwBWWf%2Bs8u5J6VoelvtEyiZIO4l%2FQdeJ26GqDLRgWElEMAlBE3TJo7m3UuE8gOQPsYBCwBSfLI1bTIytNOHZMUlWuVtMQxEHzUOujAp%2Fgqn1Q8TGGzy5GoeEmzw%2FD80xs%2BALjhT%2BxdiN9riG6%2BEcObrhPoudxl32jUhVH0EmGJwjgiJFQpz%2FLfKr86LrCQ%3D%3D",
    "error": "Cannot read property 'email' of undefined",
    "completed_at": "2023-01-19T22:13:39.219Z"
}

但我只使用同一 API 调用的 Python 脚本获取前两个键值对:

Python 的响应

 csv key: 63c9c0927885bf003ecd3a1b
 api url: https://api.eventive.org/temporary_exports/63c9c0927885bf003ecd3a1b
        <Response [200]>
        response:[{'id': '63c9c0927885bf003ecd3a1b', 'description': 'Streaming analytics'}]
    
    Process finished with exit code 0

我的Python脚本代码是:

import requests
import json

url_for_key = 'https://api.***.org/reports/streams?event_bucket=63279b48d8f8f1009209694f&start=1674111600000&end=1674198000000&tz=America%2FDenver'
api_key = '*************************'
header = {'content-type': 'application/json'}

r1 = requests.get(url=url_for_key, auth=(api_key, ''))

csv_obj = [r1.json()]
csv_key = csv_obj[0]['temporary_export']
#print(csv_obj)
print(f'csv key: {csv_key}')



url_for_link = 'https://api.***.org/temporary_exports/{}'.format(csv_key)
print(f'api url: {url_for_link}')

r2 = requests.get(url=url_for_link, headers=header, auth=(api_key, ''))
print(r2)
print(f'response:{[r2.json()]}')

csv_key 与 id 相同。谁能帮助我了解发生了什么事吗?

非常感谢,

python postman
1个回答
0
投票

我想我迟到了。但也许这会回答你的问题:

要解决此问题,您可以尝试使用 Python 中的 csv 模块直接读取 CSV 响应,或者使用 pandas 等第三方库将 CSV 响应读取到数据框中。

这应该将 API 中的 CSV 响应读取到字典列表中,其中每个字典代表 CSV 响应中的一行。然后,您可以访问每个字典中的键和值来获取您需要的数据。

这是使用 csv 模块的示例:

import requests
import csv

url_for_key = 'https://api.***.org/reports/streams?event_bucket=63279b48d8f8f1009209694f&start=1674111600000&end=1674198000000&tz=America%2FDenver'
api_key = '*************************'
header = {'content-type': 'application/json'}

r1 = requests.get(url=url_for_key, auth=(api_key, ''))

csv_obj = r1.json()
csv_key = csv_obj['temporary_export']
print(f'csv key: {csv_key}')

url_for_link = f'https://api.***.org/temporary_exports/{csv_key}'
print(f'api url: {url_for_link}')

r2 = requests.get(url=url_for_link, headers=header, auth=(api_key, ''))

# Read the CSV response using the csv module
reader = csv.DictReader(r2.iter_lines(decode_unicode=True))
response = [row for row in reader]

print(response)

在您的代码中,您使用方括号

r1.json()
r2.json()
将来自
[r1.json()]
[r2.json()]
的响应对象包装在列表中,这是不必要的。这导致响应被打印为字典列表,即使列表中只有一本字典。

在更新后的代码中,我直接访问 r2.json() 返回的字典,其中应包含 API 返回的所有键值对。

此外,在您的代码中,您没有检查响应状态代码来查看请求是否成功。在尝试解析响应之前,您应该始终检查状态代码以确保请求成功。

它还使用 csv 模块来解析 CSV 响应,这是比尝试将其解析为 JSON 更合适的方法。

© www.soinside.com 2019 - 2024. All rights reserved.