0

好吧,我需要一些帮助来解决我认为是一个简单的问题,但是在挖掘了一段时间之后,我会把它留给你们聪明的人来告诉我为什么我不是!

我正在尝试访问提供程序 api,我尝试访问的 URL 是:::.../proposals/AnotherTestProposal/city_furniture/items?filter=description$CONT"Ag" 这是他们希望传递的方式,它应该返回所有描述中包含字符串“Ag”的项目。我知道我目前有两个。

我正在使用 Django 1.9.4 和 requests_oauthlib 创建 OAuth1Session,我也成功地做到了这一点,因为我可以在没有 URL 参数的情况下访问资源。问题是我无法让"?filter=description..."部件正确编码,它给了我一个 401。

当我将 .contents 呈现为 HTML 时,我得到:

{"status": 404, "message": "", "data": [], "arguments": {"id": "items?filter=description$CONT\"Ag\"", "collection": "city_furniture"}}

这告诉我“AG”部分正在被转义,这是我不想要的。如:我不想要“Ag”,我想要“Ag”。

所以,我的问题是:我怎样才能通过参数传递 URL,所以它们不包含斜杠,因为它们导致 URL 无效,从而使我无法正确访问数据?

其他可能不相关的信息:

  1. 我现在传递给 OAuth1Session 对象的 URL 字符串的参数部分是:'/city_furniture/items%3Ffilter%3Ddescription%24CONT%22Ag%22'

  2. 从 API 网站过滤的示例:proposals/master/roads/items?filter=description$CONT"highway"

  3. 我尝试将“编码”arg 传递给 .get(以更改 to_native_string 使用的编码)但请求拒绝它说它是无效的 arg

根据评论,一些额外的代码。使用函数名称get_protected_code()获取正确传递的 OAuth 信息,然后在views.py

api_filter_url =  settings.IW_API_MODEL_COLLECTION + '/' + model_id + '/' + settings.IW_API_PROPOSAL_COLLECTION + '/' + proposal_name + '/city_furniture/items%3Ffilter%3Ddescription%24CONT%22Ag%22'
    json_model_info_pull = get_protected_data(api_filter_url)
    find_vendor = json_model_info_pull.content

def get_protected_data(url_str):
    ## ...stuffs to create OAuth1Session...
    adsk_pull = OAuth1Session(key,
                              client_secret=secret,
                              resource_owner_key=oauth_token_use,
                              resource_owner_secret=oauth_token_secret_use,
                              )
    headers = {'accept': 'application/vnd.autodesk.infraworks-v1+json'}
    api_url = settings.ADSK_IW_INFO_BASE_URL + url_str
    json_model_info_pull = adsk_pull.get(api_url, headers=headers)
    return json_model_info_pull
4

1 回答 1

0

看起来您通过将参数附加到 URL 编码中的 URL 末尾而错误地传递了参数,这requests被认为是有意的,并且 API 端点正在以非预期的方式进行转换。

的文档中requests,您应该为: a提供一个params关键字参数,其中包含应该编码并作为请求的查询字符串发送的键值对。例如,要对GitHub API运行查询,我们可以将 API 令牌作为查询参数传递:requests.getdict

requests.get('http://api.github.com/user',
    params={ 'access_token' : MY_OAUTH_TOKEN })

结果请求将包含一个查询字符串,其access_token参数设置为存储的值MY_OAUTH_TOKEN并根据需要正确转义。(例如,此类标记通常包含=在查询字符串值中无效的字符。)

于 2016-06-16T11:44:17.350 回答