用于休息 api 的 Python 删除请求(在 gae 上)

Posted

技术标签:

【中文标题】用于休息 api 的 Python 删除请求(在 gae 上)【英文标题】:Python Delete Request for a rest api (on gae) 【发布时间】:2015-03-25 20:09:45 【问题描述】:

找了一阵子,找到了下面一个需要Delete方法的api调用的解决方案。

第一次尝试:(httplib 库)

    url = '/v1/users/'+ spotify_user_id +'/playlists/'+ playlist_id +'/tracks'
    data = json.dumps("tracks": [ "uri" : track_uri ])
    headers = 
        'Authorization' : 'Bearer ' + access_token,
        'Content-Type' : 'application/json'
         

    conn = httplib.HTTPSConnection('api.spotify.com')
    conn.request('DELETE', url , data, headers) 
    resp = conn.getresponse()
    content = resp.read()
    return json.loads(content)

这会返回:

u'error': u'status': 400, u'message': u'Empty JSON body.'

第二次尝试:(urllib2库)

    url = 'https://api.spotify.com/v1/users/'+ spotify_user_id +'/playlists/'+ playlist_id +'/tracks'
    data = json.dumps("tracks": [ "uri" : track_uri ])
    headers = 
        'Authorization' : 'Bearer ' + access_token,
        'Content-Type' : 'application/json'
         

    opener = urllib2.build_opener(urllib2.HTTPHandler)
    req = urllib2.Request(url, data, headers)
    req.get_method = lambda: 'DELETE'

    try:
        response = opener.open(req).read()
        return response
    except urllib2.HTTPError as e:
        return e

这会返回:

HTTP 400 错误请求

我有 JSON 工作的其他功能,所以我猜问题出在 DELETE 方法上,但我无法让它工作。

除此之外,webapp 正在谷歌应用引擎上运行,所以我无法安装数据包,所以我想保留在预安装的库中。 任何人都有在 GAE 上执行删除请求的好方法吗? (我需要同时发送数据和标题)

API 是 spotify:developer.spotify.com/web-api/,我正在尝试从播放列表中删除曲目。

【问题讨论】:

非常感谢您提出问题。至少在一天之内,你让我对 SO 重新产生了信心。 您的第二个示例看起来很奇怪您是否考虑过尝试 urlfetch - 它支持 DELETE 方法。 cloud.google.com/appengine/docs/python/urlfetch/fetchfunction 我尝试使用 urlfetch 并得到以下响应:u'error': u'status': 400, u'message': u'Empty JSON body.' 【参考方案1】:

经过大量研究,我发现这是不可能的。

如 RFC 7231 所述(感谢 @lukasa 指出 RFC 2616 已过时),关于 DELETE 方法:

DELETE 方法请求源服务器删除 目标资源与其当前资源之间的关联 功能。 实际上,这个方法类似于rm命令 在 UNIX 中:它表示对 URI 映射的删除操作 源服务器,而不是期望以前 相关信息被删除。

也就是说,删除轨道不需要在正文中传递 track_uri,但它应该在 URI 中。

另外,在 RFC 中:

删除请求消息中的有效负载没有定义的语义; 在 DELETE 请求上发送有效负载正文可能会导致一些现有的 拒绝请求的实现。

Google App Engine 就是这种情况之一,它不允许 DELETE 请求有正文。

也就是说 Spotify 的回应很有道理:

空 JSON 正文。

在谷歌应用程序中获取 URL 的最佳方式可能是 their API for it,我知道其余的请求都在使用它。(对于那些使用 GAE 并在 httplib、urllib2 和其他人之间挣扎的人)。

我用来参考的帖子是this one。

我已经询问 Spotify 是否有替代方案,他们的回答是删除了我对 Disqus 的评论!!

【讨论】:

对此的更新。 RFC 7231 Section 4.3.5 取代了您到 RFC 2616 的链接,它表示“删除请求消息中的有效负载没有定义的语义;在删除请求上发送有效负载正文可能会导致某些现有实现拒绝该请求。”这与禁止 DELETE 上的有效负载不同:它是完全允许的。然而,这意味着使用一个是棘手的,最好避免。 当我们在这里时,请注意所有 Python HTTP 库都允许您在不使用 GAE 时发送正文:只有在 GAE 上他们才禁止它。 谢谢@Lukasa,我已经用新的 RFC 编辑了我的答案。答案保持不变,因为 Spotify 删除了我对 Disqus 的评论

以上是关于用于休息 api 的 Python 删除请求(在 gae 上)的主要内容,如果未能解决你的问题,请参考以下文章

Linkedin API 对个人资料的休息请求

Ajax 获取休息 API 的请求

用于进行休息 api 查询的 Apollo 'Like' 钩子

Azure 存储休息 API(放置 Blob API)

使用 Outlook 日历休息 API 添加与会者会删除较旧的与会者

如何使用rest api写入firebase数据库?