Python 尝试使用urllib2发送JSON负载,获取HTTPError 400
下面是一个代码示例:Python 尝试使用urllib2发送JSON负载,获取HTTPError 400,python,json,urllib2,Python,Json,Urllib2,下面是一个代码示例: # Not actual payload, but exact same structure. Verified that payload is correct. payload = { 'object': { 'token': '6867r474850557', 'contact': { 'FirstName': 'Jim', 'LastName': 'Bob',
# Not actual payload, but exact same structure. Verified that payload is correct.
payload = {
'object': {
'token': '6867r474850557',
'contact': {
'FirstName': 'Jim',
'LastName': 'Bob',
'Email': 'email@fmail.com',
'Phone': '111-111-1111'
},
'request': {
'Subject': 'Hello!',
'Message': 'Test Message'
},
'fields': [ "LastName", "FirstName" ]
}
}
r = urllib2.Request("https://someawesomeurl.com", json.dumps(payload), {"Content-type": "application/json"})
f = urllib2.urlopen(r)
resp = f.read()
调用urlopen失败,错误为urllib2.HTTPError:HTTP error 400:Bad Request
。我猜我没有正确地发送JSON负载,但我不确定我必须做什么来纠正它
编辑
下面是我试图用Python实现的PHP实现:
$url = 'https://someawesomeurl.com';
$body = array (
'object' => array(
'token' => '6867r474850557',
'contact' => array (
'FirstName' => "Jim",
'LastName' => "Bob",
'Email' => "email@fmail.com",
'Phone' => "111-111-1111"
),
'request' => array (
'Subject' => "Hello!",
'Message' => "Test Message"
),
'fields' => array('LastName')
));
$params = json_encode($body);
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $params);
curl_setopt($curl, CURLOPT_HTTPHEADER, array( "Content-type: application/json"));
$response = curl_exec($curl);
EDIT#2发送JSON时,urllib2
是否可能正在修改JSON?我已将urlopen
调用包装在try/except块中,并打印出HTTPError的异常消息
:
[{"message":"Premature end of list at [line:1, column:727]","errorCode":"JSON_PARSER_ERROR"}]
我已经通过lint运行了JSON,但它恢复为有效,因此我不知道服务器为什么会抱怨格式错误。这不适用于urllib2,您必须“请求”(http for human): 文档为您的用例提供了示例: 我的一个项目中的一个示例:
def query(self, path, **kwargs):
"""the token must be given as GET and args as POST JSON object"""
encoded_args = urllib.urlencode({"token": self.token})
url = self.url_tpl % ('/api/%s' % path, encoded_args)
headers = {'content-type': 'application/json'}
data = json.dumps(kwargs).encode('utf-8')
response = requests.post(url, data=data, headers=headers)
if response.status_code == 200:
return response.json
else:
raise Exception("response status: %s" % response.status_code)
我建议你看看那页上的一些建议。将内容长度添加到标头并对有效负载进行URL编码(而不是使用json.dumps)会产生相同的错误。您是否将请求指向可以接受您发送的数据的有效域。你能在本地主机上设置一些东西来更好地诊断问题吗。这可能是服务器的问题。是的。我可以通过PHP(使用curl)将相同的有效负载发送到相同的地址,效果很好。需要应用程序引擎的Python实现。这对我很有帮助&修复了我尝试以类似方式连接SugarCRM的API时遇到的问题。有一件事让我很吃惊,Sugar期望一个“PUT”&urllib2只允许“POST”或“GET”,除非您调整它()