从API检索信息的问题

时间:2018-07-02 15:00:43

标签: python request python-requests gooddata

很遗憾,我无法提供可重复的数据集。我正在尝试连接到API并从GoodData中提取报告数据。我已经能够成功连接并提取报告,但是偶尔失败。脚本中有一个特定的点,它失败了,我无法弄清楚为什么有时它会起作用,而不是其他人。

连接到GD API,获取临时令牌

我创建了以下功能来下载报告。函数参数是gooddata中的项目ID,从登录/身份验证中收到的临时令牌,要调用的文件名以及从调用特定项目和报告ID时获得的uri。 uri就像数据的位置。

uri看起来像(不是真正的uri)。

'{"uri":"/gdc/projects/omaes11n7jpaisfd87asdfhbakjsdf87adfbkajdf/execute/raw/876dfa8f87ds6f8fd6a8ds7f6a8da8sd7f68as7d6f87af?q=as8d7f6a8sd7fas8d7fa8sd7f6a8sdf7"}'

from urllib2 import Request, urlopen
import re
import json
import pandas as pd
import os
import time

# function
def download_report(proj_id, temp_token, file_name, uri, write_to_file=True):
    headers = {
          'Accept': 'application/json',
          'Content-Type': 'application/json',
          'X-GDC-AuthTT': temp_token
        }

    uri2 = re.sub('{"uri":|}|"', '', uri)

    put_request = Request('https://secure.gooddata.com' + uri2, headers=headers)

    response = urlopen(put_request).read()

    with open(file_name + ".csv", "wb") as text_file:
        text_file.write(response)

    with open(file_name + ".csv", 'rb') as f:
        gd_data = pd.read_csv(f)

    if write_to_file:
        gd_data.to_csv(file_name + '.csv', index=False)
    return gd_data

uri附加到普通的gooddata URL,以及标头,将信息提取为文本格式,然后转换为csv / dataframe。

由于某种原因,数据帧基本上只是将uri变成数据帧,而不是将数据从链接中拉出。我发现奇怪的最后一件事是,当我启动Spyder并尝试使用它时,它总是第一次失败。如果我尝试再次运行它,它将起作用。我不知道为什么由于我试图按计划运行此程序,因此它一天成功运行了几天,然后又开始出现故障。

2 个答案:

答案 0 :(得分:1)

之所以有时会获取数据结果的URI,而不是实际数据结果的原因,是因为该数据结果尚未准备好。有时需要一段时间才能计算出报告。除URI外,您还将获得HTTP状态202。这表示请求已被接受,但结果尚未完成。

使用getcode()方法检查HTTP状态。如果得到202,则再次请求URI,直到得到200,然后读取数据结果。

答案 1 :(得分:0)

请首先尝试是否在 curl 上收到响应(确保URL正确)

curl \
  -H "Content-Type: application/json" \
  -H "X-GDC-AuthTT: temp_token" \

https://secure.gooddata.com/gdc/projects/omaes11n7jpaisfd87asdfhbakjsdf87adfbkajdf/execute/raw/876dfa8f87ds6f8fd6a8ds7f6a8da8sd7f68as7d6f87af?q=as8d7f6a8sd7fas8d7fa8sd7f6a8sdf7