python - python requests 获取请求调试
问题描述
/api/stats
?fields=["clkCnt","impCnt"]
&ids=nkw0001,nkw0002,nkw0003,nkw0004
&timeRange={"since":"2019-05-25","until":"2019-06-17"}
我目前正在开发一个名为 naver_searchad_api 的 API 链接到 api 的 github 如果您想查看它。但我认为你不需要
最终的 url 应该是baseurl + /api/stats
字段和 ids 上timeRange
的 and ,url 应该是这样的
我写的请求如下
r = requests.get(BASE_URL + uri, params={'ids': ['nkw0001','nkw0002','nkw0003','nkw0004'], 'timeRange': {"since": "2019-05-25", "until": "2019-06-17"}}, headers=get_header(method,uri,API_KEY,SECRET_KEY,CUSTOMER_ID))
final_result = r.json()
print(final_result)
正如我在下面所做的那样
print(r.url)
它返回如下
https://api.naver.com/stats?ids=nkw0001&ids=nkw0002&ids=nkw0002&ids=nkw0002&fields=clkCnt&fields=impCnt&timeRange=since&timeRange=until
'ids' 是重复的,并且没有我输入的日期。
我将如何使我的代码适合正确的网址?
解决方案
查询字符串是键值对。所有的键和值都是字符串。任何不能轻易转换为字符串的东西都取决于约定。换句话说,这些东西是没有标准的,所以就看API的期望了。
例如,API 可以定义值列表以逗号分隔的字符串形式给出,或者它可以说任何复杂的东西都应该是 JSON 编码的。
事实上,这正是 API 文档所说的:
字段字符串 要检索的字段(JSON 格式字符串)。 例如,["impCnt","clkCnt","salesAmt","crto"]
也是如此timeRange
。其他值可以保持不变。因此我们只对这两个值进行 JSON 编码。
我们可以通过 dict 理解内联地做到这一点。
import json
import requests
params = {
'fields': ["clkCnt", "impCnt"],
'ids': 'nkw0001,nkw0002,nkw0003,nkw0004',
'timeRange': {"since":"2019-05-25","until":"2019-06-17"},
}
resp = requests.get('https://api.naver.com/api/stats', {
key: json.dumps(value) if key in ['fields', 'timeRange'] else value for key, value in params.items()
})
除了符合 API 的预期之外,查询字符串中的所有键和值都需要进行 URL 编码。幸运的是,该requests
模块负责该部分,所以我们需要做的就是将一个 dict 传递给requests.get
.
推荐阅读
- regex - 在文件中转换日期格式
- android - 客户端的 Firebase
- google-cloud-firestore - 如何在 dialogflow bot 中从单个用户获取所有必需的详细信息,并将其存储在 firestore 中的单个 userId 下
- api - 如何在 Jitterbit 中使用 Composite API 在 Salesforce 中插入记录?
- angular - 如何在 TypeScript 中解码 html 元素?
- python-3.x - 使用 selenium webdriver 创建数据库并导出为 CSV?
- c++ - 与来自 boost::asio 的同步代码接口
- delphi - "type PDW = ^dword;" 是什么意思?在德尔福是什么意思?
- php - PHP & Imagemagick:将表格渲染为图像,但模糊图像的下边缘
- rest - SSAS 表格 - 通过从 Rest API 读取安全权利来应用行级过滤