在python中创建POST请求,需要将数据作为multipart / form-data发送?

时间:2017-02-01 20:31:21

标签: python python-3.x post

我正在为朋友编写一个非常简单的Python应用程序,它将查询服务并获取一些数据作为回报。我可以轻松地管理GET请求,但我遇到了POST请求的问题。为了让我的脚湿透,我只是略微修改了他们的示例JSON数据,但是当我发送它时,我收到了一个错误。这是代码(标识信息已更改):

import urllib.request
import json

def WebServiceClass(Object):

    def __init__(self, user, password, host):
        self.user = user
        self.password = password
        self.host = host
        self.url = "https://{}/urldata/".format(self.host)

        mgr = urllib.request.HTTPPasswordMgrWithDefaultRealm()
        mgr.add_password(None, "https://{}".format(self.host), self.user, self.password)
        self.opener = urllib.request.build_opener(urllib.request.HTTPDigestAuthHandler(mgr))

username = "myusername"
password = "mypassword"
service_host = "thisisthehostinfo"

web_service_object = WebServiceClass(username, password, service_host)

user_query = {"searchFields": 
        {
        "First Name": "firstname",
        "Last Name": "lastname"
        },
        "returnFields":["Entity ID","First Name","Last Name"]
        }

user_query = json.dumps(user_query)
user_query = user_query.encode("ascii")

the_url = web_service_object.url + "modules/Users/search"

try:
    user_data = web_service_object.opener.open(the_url, user_query)
    user_data.read()

except urllib.error.HTTPError as e:
    print(e.code)
    print(e.read())

我从他们的API文档中获取了类数据。

正如我所说的,我可以做好GET请求,但是这个POST请求给出了500错误,其中包含以下文字:

Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported

在研究这个错误时,我的假设已经变成上述错误意味着我需要将数据作为multipart / form-data提交。这个假设是否正确是我想要测试的,但是库存Python看起来没有任何简单的方法来创建多部分/表单数据 - 那里有模块,但它们似乎都是一个文件并将其转换为multipart / form-data,而我只想将这个简单的JSON数据转换为test。

这引出了两个问题:在我的假设中我是否需要使用multipart / form-data才能使其正常工作?如果是这样,我是否需要将我的JSON数据放入文本文件并使用其中一个模块将其转换为多部分,或者有没有办法在不创建文件的情况下执行此操作?

1 个答案:

答案 0 :(得分:1)

也许您想尝试请求lib,您可以传递files参数,然后请求将发送multipart / form-data POST而不是application / x-www-form-urlencoded POST。但是,您不限于使用该字典中的实际文件:

import requests
response = requests.post('http://httpbin.org/post', files=dict(foo='bar'))
print response.status_code

如果您想了解有关请求lib的更多信息,特别是在发送多部分表单时请看一下:

http://docs.python-requests.org/en/master/http://docs.python-requests.org/en/master/user/advanced/?highlight=Multipart-Encoded%20Files