python请求获取请求调试信息

时间:2019-06-25 13:50:21

标签: 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 link to github of the api If you want to check it out. but i don't think you need to

最终网址应为baseurl + /api/stats 并在字段和ID和timeRange上,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

“ id”重复出现,没有我输入的日期。

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

1 个答案:

答案 0 :(得分:1)

查询字符串是键值对。所有键和所有值都是字符串。不能轻易转换为字符串的任何内容都取决于约定。换句话说,对于这些东西没有标准,因此取决于API的期望。

例如,API可以将值列表定义为以逗号分隔的字符串形式给出,或者可以说任何复杂的事物都应使用JSON编码。

实际上,这正是API文档所说的:

fields   string  
Fields to be retrieved (JSON format string).

For example, ["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模块负责这一部分,因此我们要做的就是将字典传递给requests.get