我正在为朋友编写一个非常简单的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数据放入文本文件并使用其中一个模块将其转换为多部分,或者有没有办法在不创建文件的情况下执行此操作?
答案 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