首页 > 解决方案 > 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' 是重复的,并且没有我输入的日期。

我将如何使我的代码适合正确的网址?

标签: pythonpython-requests

解决方案


查询字符串是键值对。所有的键和值都是字符串。任何不能轻易转换为字符串的东西都取决于约定。换句话说,这些东西是没有标准的,所以就看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.


推荐阅读