这两个请求有什么区别?

时间:2018-03-30 06:26:37

标签: python python-2.7 python-requests urllib2

对于任务自动化,我需要编写一些python代码,这会向Web服务发出请求,然后检索信息等。

首先我尝试使用请求。

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 个答案:

答案 0 :(得分:3)

从请求版本2.4.2开始,您可以将请求中的json参数用作

requests.post(url, headers=headers, json=body) 

如果使用json参数,还可以删除'application / json'标头,因为json参数使其冗余。

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

将dict转换为json
data = json.dumps(body)

答案 1 :(得分:2)

没有"本地词典" HTTP世界中的格式。

真正的区别在于 var result = File .ReadLines(@"c:\MyFile.txt") .Select(line => Regex.Match( line, @"^\s*set\s+(?<key>[A-Za-z0-9]+)\s*=\s*(?<value>.*)$")) .Where(match => match.Success) .Select(match => new KeyValuePair<string, string>( match.Groups["key"].Value, match.Groups["value"].Value)) .ToArray(); // Let's get pairs as an array 太聪明了。

requests中使用data=时,您尝试发布requests。在这种情况下,multipart/form-data将以dict格式解压缩为键值对。

form-data中使用json=时,requests会自动requests将您的json.dumps转换为原始字节字符串并为您设置dict

但是在Content-Type中,它只会给你提供。您需要手动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的提醒。

相关问题