Python在使用“def”API时不返回任何内容(或错误)

2024-10-02 20:33:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我不知道如何确切地问这个问题,因为我不能共享API访问。如果有人能以正确的方式提出问题,我将不胜感激。你知道吗

我有一个代码,它可以很好地工作,并执行我需要的,但当我在DEF函数中使用这个API请求代码时,它返回时没有任何内容或错误。。。你知道吗

错误很简单,我无法获得输出,或返回0值

代码如下:

def sm_main_data():


    #DATA PROCESSING - Impression|Engagements|VideoViews
    urlMain = "https://api.simplymeasured.com/v1/analytics/" + key.accountId + "/posts/metrics?\
    filter=analytics.timeseries_key.gte(" + config.start + ").lte(" + config.end + ")&\
    filter=channel.eq(" + config.which_social_media + ")&\
    metrics=analytics.engagement_total,analytics.video.views_count,analytics.impressions&\
    dimensions=data_source_id,channel,analytics.timeseries_key.by(" + config.per_what + ")"

    headers = {'content-type': 'application/json',
            'Authorization': 'Bearer ' + key.token}

    #Receive data from SM (main data) / modified it and save as JSON file
    responseMain = requests.get(urlMain, headers=headers).json()
    pprint.pprint(responseMain)
    pass

sm_main_data()

我尝试在def中打印变量:

print(key.accountId)
print(config.start)
print(config.end)
print(config.which_social_media)
print(config.per_what)

全部打印正确。你知道吗

现在我迷路了。。。甚至无法从理论上了解出什么问题。为什么这个代码在def函数中不起作用???你知道吗

编辑1.0

错误

{u'errors': [{u'detail': u'`    filter` parameter is not supported.,`    metrics` parameter is not supported.,`    dimensions` parameter is not supported.',
              u'status': u'422',
              u'title': u'Unprocessable Entity'}]}

编辑1.1

不带def的代码

#DATA PROCESSING - Impression|Engagements|VideoViews
urlMain = "https://api.simplymeasured.com/v1/analytics/" + key.accountId + "/posts/metrics?\
filter=analytics.timeseries_key.gte(" + config.start + ").lte(" + config.end + ")&\
filter=channel.eq(" + config.which_social_media + ")&\
metrics=analytics.engagement_total,analytics.video.views_count,analytics.impressions&\
dimensions=data_source_id,channel,analytics.timeseries_key.by(" + config.per_what + ")"

headers = {'content-type': 'application/json',
    'Authorization': 'Bearer ' + key.token}

#Receive data from SM (main data) / modified it and save as JSON file
responseMain = requests.get(urlMain, headers=headers).json()
pprint.pprint(responseMain)

Tags: key代码configjsondatamaindefchannel
1条回答
网友
1楼 · 发布于 2024-10-02 20:33:16

该错误显示您正试图将参数发送到服务器,参数前面有额外的空格:

`    filter` parameter is not supported.
`    metrics` parameter is not supported.

名称前的额外空格是参数名称的一部分,因为您在字符串中包含了这些空格:

def sm_main_data():
    # ...
    urlMain = "https://api.simplymeasured.com/v1/analytics/" + key.accountId + "/posts/metrics?\
    filter=analytics.timeseries_key.gte(" + config.start + ").lte(" + config.end + ")&\
    filter=channel.eq(" + config.which_social_media + ")&\
    metrics=analytics.engagement_total,analytics.video.views_count,analytics.impressions&\
    dimensions=data_source_id,channel,analytics.timeseries_key.by(" + config.per_what + ")"

# ^^^ those lines are indented but the whitespace is part of the string

如果您出于任何其他原因缩进了urlMain字符串定义,比如if语句或try...except语句,而不仅仅是函数,您也会遇到同样的问题。你不必缩进那些在字符串文本中的部分。你知道吗

与在字符串中使用\连续体不同,您可以使用separate string literals to create one long string,或者在下一行中以结束语"结尾,后跟+"开始引号:

urlMain = (
    "https://api.simplymeasured.com/v1/analytics/" + 
    key.accountId + "/posts/metrics?" +
    "filter=analytics.timeseries_key.gte(" + config.start + ").lte(" + config.end + ")&" +
    "filter=channel.eq(" + config.which_social_media + ")&" +
    "metrics=analytics.engagement_total,analytics.video.views_count,analytics.impressions&" +
    "dimensions=data_source_id,channel,analytics.timeseries_key.by(" + config.per_what + ")"
)

所有这些+串联都不是很可读,您应该真正使用string formatting将值插入到字符串中。你知道吗

但是,您不需要构建这样的字符串,因为当您将字典作为params参数时,requests可以为执行此操作。使用列表为给定参数名传入多个值:

url = "https://api.simplymeasured.com/v1/analytics/{k.accountId}/posts/metrics".format(
    k=key)
params = {
    'filter': [  # a list for multiple entries: filter=...&filter=...
        'analytics.timeseries_key.gte({c.start}).lte({c.end})'.format(c=config),
        'channel.eq({c.which_social_media})'.format(c=config),
    ],
    'metrics': (
        'analytics.engagement_total,analytics.video.views_count,'
        'analytics.impressions'),
    'dimensions':
        'data_source_id,channel,'
        'analytics.timeseries_key.by({c.per_what})'.format(c=config),
}
headers = {'Authorization': 'Bearer {k.token}'.format(k=key)}
responseMain = requests.get(urlMain, params=params, headers=headers).json()

这里我使用str.format()插入来自configkey对象的值;注意占位符会拉出属性

注意:我删除了Content-Type头,因为该头不适用于GET请求(它没有内容,请求体总是空的)。你知道吗

相关问题 更多 >