【问题标题】:UrlFetch PUT is sending a Post Request?UrlFetch PUT 正在发送 Post 请求?
【发布时间】:2015-08-16 21:42:22
【问题描述】:

我正在尝试使用 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。

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

【问题讨论】:

    标签: python google-app-engine urllib mlab urlfetch


    【解决方案1】:

    str.format() 返回格式化的字符串,它不会就地更新它。因此

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

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

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

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


    更新

    现在您正在设置 Content-Type: application/json 标头,您需要在有效负载中发送 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'})
    

    【讨论】:

    • 刚刚解决了这个问题...仍然发送一个 POST 请求并且在数据库中没有识别到​​更新:(。谢谢
    • 您是否检查了响应正文中的错误消息?
    • 取得了一些进展!我收到错误消息 { "message" : "No Content-Type set, expecting 'application/json'."},所以我将字段 headers={'Content-Type': 'application/json'})) 添加到urlfetch.fetch() 调用。我仍然收到一个帖子,我不知道为什么....
    • 您发送的有效负载不是 JSON。我已经更新了我的答案,详细说明了如何解决这个问题。不确定是 POST 而不是 PUT……这有点奇怪。
    • 顺便说一句,您为什么不使用 pymongo 或 mongodb 文档中推荐的其他库?
    猜你喜欢
    • 2023-03-31
    • 2020-07-14
    • 2016-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-22
    • 2019-05-16
    相关资源
    最近更新 更多