UrlFetch PUT 正在发送 Post 请求?

UrlFetch PUT is sending a Post Request?

我正在尝试使用 MongoLab Rest API http://docs.mongolab.com/data-api/ 更新 MongoDB 数据库中的文档。

在文档中它说使用 PUT 请求更新集合中的文档,并在 http 请求的正文中使用更新运算符。

因此,根据文档,我尝试了以下操作:

        urlinsert = 'https://api.mongolab.com/api/1/databases/ur_coursesniper/collections/classes?apiKey={key}&q={q}'
        urlinsert = urlinsert.format(q=querycheck, key=CONFIG["key"])
        form_fields = {
            "$push" : { "Users" : email},
        }
        form_data = urllib.urlencode(form_fields)
        result = urlfetch.fetch(url=urlinsert,
            payload=form_data,
            method=urlfetch.PUT,)

但是,此代码块执行后集合中的文档不会更新。

我收到的 HTTP 响应是

2015-08-16 10:55:45,129 module.py:812] default: "POST / HTTP/1.1" 200 91

这令人费解,因为它表示响应既成功又 POST。

对到底发生了什么有什么想法吗?

str.format() returns 格式化字符串,它不会更新到位。因此

urlinsert.format(q=querycheck, key=CONFIG["key"])

urlinsert的值没有影响,发送查询字符串apiKey={key}&q={q}。试试这个:

urlinsert = urlinsert.format(q=querycheck, key=CONFIG["key"])

看看 mongodb 响应的 body 中包含的内容会很有趣 - 它可能包含一条错误消息。


更新

现在您正在设置 Content-Type: application/json header,您需要在负载中发送 JSON 数据。 "$push" : { "Users" : email} 无效 JSON。您可以使用 json.dumps()form_fields 字典转换为有效的 JSON 字符串:

import json

urlinsert = 'https://api.mongolab.com/api/1/databases/ur_coursesniper/collections/classes?apiKey={key}&q={q}'
urlinsert = urlinsert.format(q=querycheck, key=CONFIG["key"])
form_fields = {"$push": {"Users": email}}

result = urlfetch.fetch(url=urlinsert,
    payload=json.dumps(form_fields),
    method=urlfetch.PUT,
    headers={'Content-Type': 'application/json'})