使用data = {...}参数时,Request.put方法获得500响应,而使用json = {...}参数时获得200响应。为什么?

时间:2017-09-19 14:43:31

标签: rest api python-requests

res = requests.put(url=self.URL, json=self.output) # gives <Response [200]>
res = requests.put(url=self.URL, data=self.output) # gives <Response [500]>

这是我要上传的字典的示例:

{u'RPT6': '22,4', u'RPT7': '13,2', u'RPT4': '4,1', u'RPT5': '13,1', u'RPT2': '18,4', u'RPT3': '7,1', u'RPT1': '1,1', 'Last Change Time': '2017/09/19 - 16:24:28', u'RPT8': '5,1', u'RPT9': '10,3', '
Last Change Author': 'CNBCN477QB', u'RPT10': '22,4', u'RPT11': '22,3', u'RPT12': '15,3'}

此dictonary是使用www.myjson.com方法从同一网址requests.get获取的原始json文件的修改。因此我理解服务器没有问题。在被叫the related documentation之后,我无法发现为什么我会收到该错误,因为它清楚地表明字典的使用符合data参数。

1 个答案:

答案 0 :(得分:1)

区别在于data参数会对您的数据进行urlencode并创建'application / x-www-form-urlencoded'Content-Type标头,而json参数将发送json格式化数据和'application / json'Content-Type标头。

让我们看看服务器使用data参数收到的内容:

data = {'key 1':'a string', 'key 2': 2, 'key 3':True}
res = requests.put('http://somesite.com', data=data)

print(res.request.method + ' / HTTP/1.1')
print('\r\n'.join(': '.join(i) for i in res.request.headers.items()))
print()
print(res.request.body)
  

PUT / HTTP / 1.1
  连接:保持活力
  Accept-Encoding:gzip,deflate
  接受: /
  User-Agent:python-requests / 2.18.1
  内容长度:33
  内容类型:application / x-www-form-urlencoded

     

key + 1 = a + string&amp; key + 2 = 2&amp; key + 3 = True

现在让我们使用json参数发送相同的数据:

data = {'key 1':'a string', 'key 2': 2, 'key 3':True}
res = requests.put('http://somesite.com', json=data)

print(res.request.method + ' / HTTP/1.1')
print('\r\n'.join(': '.join(i) for i in res.request.headers.items()))
print()
print(res.request.body)
  

PUT / HTTP / 1.1
  连接:保持活力
  Accept-Encoding:gzip,deflate
  接受: /
  User-Agent:python-requests / 2.18.1
  内容长度:48
  Content-Type:application / json

     

{“key 1”:“a string”,“key 2”:2,“key 3”:true}

正如您所看到的,两个HTTP请求非常不同。