我是一个完整的Python菜鸟,我正在尝试使用urllib2运行cURL等价物。我想要的是一个Python脚本,在运行时,它将与终端中的以下cURL命令完全相同:
curl -k -F docfile=@myLocalFile.csv http://myWebsite.com/extension/extension/extension
我在教程页面上找到了以下模板:
import urllib
import urllib2
url = "https://uploadWebsiteHere.com"
data = "{From: 'sender@email.com', To: 'recipient@email.com', Subject: 'Postmark test', HtmlBody: 'Hello dear Postmark user.'}"
headers = { "Accept" : "application/json",
"Conthent-Type": "application/json",
"X-Postmark-Server-Token": "abcdef-1234-46cc-b2ab-38e3a208ab2b"}
req = urllib2.Request(url, data, headers)
response = urllib2.urlopen(req)
the_page = response.read()
但我完全迷失在'数据'和'标题'变量上。 urllib2文档(https://docs.python.org/2/library/urllib2.html)将“数据”输入定义为“指定要发送到服务器的其他数据的字符串”,将“标题”输入定义为“字典”。我完全没有深入尝试遵循这个文档,并且当我只能通过指定文件和URL在终端中完成同样的任务时,我不明白为什么需要字典。好吗?
答案 0 :(得分:1)
您发布的数据似乎不是有效的JSON。假设服务器期望有效的JSON,您应该更改它。
您的curl
调用未传递任何可选标头,因此您不需要在请求中提供更多内容。如果要验证确切的标头,可以将-vi
添加到curl
调用,并在Python代码中直接匹配它们。或者,这对我有用:
import urllib2
url = "http://localhost:8888/"
data = '{"From": "sender@email.com", "To": "recipient@email.com", "Subject": "Postmark test", "HtmlBody": "Hello dear Postmark user."}'
headers = {
"Content-Type": "application/json"
}
req = urllib2.Request(url, data, headers)
response = urllib2.urlopen(req)
the_page = response.read()
切换到使用requests
可能符合您的最佳利益,但对于这个简单的事情,可以使标准库urllib2
起作用。
答案 1 :(得分:1)
我想要的是一个Python脚本,在运行时,它将与终端中的以下cURL命令完全相同:
$ curl -k -F docfile=@myLocalFile.csv https://myWebsite.com/extension...
curl -F
使用multipart/form-data
内容类型发送文件。您可以使用requests
库轻松地重现它:
import requests # $ pip install requests
with open('myLocalFile.csv','rb') as input_file:
r = requests.post('https://myWebsite.com/extension/...',
files={'docfile': input_file}, verify=False)
verify=False
将效仿curl -k
。