对于任务自动化,我需要编写一些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()
它有效。
现在我对上述片段的不同感到好奇。他们不应该做同样的任务并收到相同的答案吗?
答案 0 :(得分:3)
从请求版本2.4.2开始,您可以将请求中的json参数用作
requests.post(url, headers=headers, json=body)
如果使用json参数,还可以删除'application / json'标头,因为json参数使其冗余。
如果要使用数据,则需要先使用
将dict转换为jsondata = 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的提醒。