Python 这两个请求之间有什么区别?

Python 这两个请求之间有什么区别?,python,python-2.7,python-requests,urllib2,Python,Python 2.7,Python Requests,Urllib2,为了实现任务自动化,我需要编写一些python代码,向web服务发出post请求,然后检索信息等 首先,我尝试使用请求 import requests def make_invoice_body(terminal, service, code, number): return { "terminalId": terminal, "serviceId" : service, "invoiceNumber": number,

为了实现任务自动化,我需要编写一些python代码,向web服务发出post请求,然后检索信息等

首先,我尝试使用请求

import requests

def make_invoice_body(terminal, service, code, number):
    return {
        "terminalId": terminal,
        "serviceId" : service,
        "invoiceNumber": number,
        "invoiceCode": code,
        "paymentType": 1,
        "requestNumber": random.randint(1000000, 9999999)
    }

headers = {'Content-Type': 'application/json'}
body = make_invoice_body(51, "1001000", "FOO", "123456")

requests.post(url, headers=headers, data=body)   
上述代码段作为响应接收到错误

然后我尝试了
urllib2

import urllib2
import json

req = urllib2.Request(url)
req.add_header('Content-Type', 'application/json')
resp = urllib2.urlopen(req, body) #body from above
print resp.read()
它成功了


现在,我对上述片段的不同之处感到好奇。他们不应该做同样的任务并得到同等的答案吗

从请求版本2.4.2及更高版本开始,您可以在请求中使用json参数作为

requests.post(url, headers=headers, json=body) 
如果使用json参数,还可以删除“application/json”头,因为json参数使其冗余

如果要使用数据,首先需要使用

data = json.dumps(body)

从请求版本2.4.2及更高版本开始,您可以在请求中使用json参数作为

requests.post(url, headers=headers, json=body) 
如果使用json参数,还可以删除“application/json”头,因为json参数使其冗余

如果要使用数据,首先需要使用

data = json.dumps(body)
HTTP世界中没有“本机dict”格式

真正的区别在于
请求
太聪明了

请求
中使用
数据=
时,您试图发布
多部分/表单数据
。在这种情况下,
dict
将解压缩为
表单数据
格式的键值对

requests
中使用
json=
时,
requests
将自动
json。将
dict
转储到原始字节字符串中,并为您设置
内容类型

但是在
urllib
中,它只不过是你的付出。您需要手动
json.dumps
您的
dict
。所以我相信你举的例子是错误的。它应该如下所示:

import urllib2
import json

req = urllib2.Request(url)
req.add_header('Content-Type', 'application/json')
resp = urllib2.urlopen(req, json.dumps(body)) #body from above
print resp.read()
感谢@t.m.adam的提醒。

HTTP世界中没有“本机dict”格式

真正的区别在于
请求
太聪明了

请求
中使用
数据=
时,您试图发布
多部分/表单数据
。在这种情况下,
dict
将解压缩为
表单数据
格式的键值对

requests
中使用
json=
时,
requests
将自动
json。将
dict
转储到原始字节字符串中,并为您设置
内容类型

但是在
urllib
中,它只不过是你的付出。您需要手动
json.dumps
您的
dict
。所以我相信你举的例子是错误的。它应该如下所示:

import urllib2
import json

req = urllib2.Request(url)
req.add_header('Content-Type', 'application/json')
resp = urllib2.urlopen(req, json.dumps(body)) #body from above
print resp.read()

感谢@t.m.adam的提醒。

收到的错误是什么?我认为这并不重要-因为我在询问两个post请求之间的区别,但如果有帮助的话,这是一个定制的内部服务器错误。收到的错误是什么?这,我认为这并不重要——因为我在问两个post请求之间的区别,但如果有帮助的话,这是一个定制的内部服务器错误,但是你能解释一下区别吗?区别在于urllib2自动将数据转换为端点所需的JSON格式。请求以web后端无法很好理解的本机dict格式发送数据,将
json=
改为
data=
解决了这个问题,但是您能解释一下区别吗?因此区别在于urllib2会自动将数据转换为端点所需的json格式。请求以本机dict格式发送数据,web后端无法理解。除了最后一行之外,您的解释非常好。
data
参数接受字符串,如果您传递dict,它将引发类型错误。op声称它有效,我对此感到困惑,但我怀疑他们使用了
json.dumps
,因为json是导入的。也许我错过了什么,如果你能解释我会很感激的+1不管怎样。@t.m.adam实际上,我没有测试
urllib2
,因为在您发表评论之前,它肯定是一个过时的库。然后我对它进行了测试,结果表明它实际上只接受字符串,而不接受dict。OP给出的例子是错误的。谢谢你澄清这一点。但我不会说
urllib
那么糟糕。出于兼容性原因,我有时会使用它(我更喜欢
请求
),而且它相当不错。当谈到发布文件时,这是一场噩梦。除了最后一行,你的解释非常好。
data
参数接受字符串,如果您传递dict,它将引发类型错误。op声称它有效,我对此感到困惑,但我怀疑他们使用了
json.dumps
,因为json是导入的。也许我错过了什么,如果你能解释我会很感激的+1不管怎样。@t.m.adam实际上,我没有测试
urllib2
,因为在您发表评论之前,它肯定是一个过时的库。然后我对它进行了测试,结果表明它实际上只接受字符串,而不接受dict。OP给出的例子是错误的。谢谢你澄清这一点。但我不会说
urllib
那么糟糕。出于兼容性原因,我有时会使用它(我更喜欢
请求
),而且它相当不错。当谈到发布文件时,这是一场噩梦。