我试图在python中发出这两个请求:
请求1:
curl -X POST -H "Content-Type: application/json" -d '{ "auth_token": "auth1", "widget": "id1", "title": "Something1", "text": "Some text", "moreinfo": "Subtitle" }' serverip
请求2:
vsphere_dict = {}
vsphere_dict['server_name'] = "servername"
vsphere_dict['api_version'] = apiVersion
vsphere_dict['guest_count'] = guestCount
vsphere_dict['guest_on'] = guestOnLen
vsphere_dict['guest_off'] = guestOffLen
#Convert output to Json to be sent
data = json.dumps(vsphere_dict)
curl -X POST -H "Content-Type: application/json" -d 'data' serverip
它们似乎都不起作用。有什么方法可以用Python发送它们吗?
更新
我无法处理的部分是pass auth和widget。我没有成功尝试以下内容:
import urllib2
import urllib
vsphere_dict = dict(
server_name="servername",
api_version="apiVersion",
guest_count="guestCount",
guest_on="guestOnLen",
guest_off="guestOffLen",
)
url = "http://ip:port"
auth = "authid89"
widget = "widgetid1"
# create request object, set url and post data
req = urllib2.Request(auth,url, data=urllib.urlencode(vsphere_dict))
# set header
req.add_header('Content-Type', 'application/json')
# send request
response = urllib2.urlopen(req)**
导致“urllib2.HTTPError:HTTP错误500:内部服务器错误”
有关如何正确传递身份验证和窗口小部件的任何想法吗?
更新:
要查看有什么不同,我已在本地启动了nc服务器。结果如下:
使用以下代码更正卷曲请求:
curl -X POST -H "Content-Type: application/json" -d '{ "auth_token": "auth", "widget": "widgetid", "title": "Something", "text": "Some text", "moreinfo": "Subtitle" }' http://localhost:8123
发送确实有效:
POST / HTTP/1.1
User-Agent: curl/7.21.0 (i386-redhat-linux-gnu) libcurl/7.21.0 NSS/3.12.10.0 zlib/1.2.5 libidn/1.18 libssh2/1.2.4
Host: localhst:8123
Accept: */*
Content-Type: application/json
Content-Length: 165
{ "auth_token": "token", "widget": "widgetid", "title": "Something", "text": "Some text", "moreinfo": "Subtitle" }
请求使用此代码
import requests
import simplejson as json
url = "http://localhost:8123"
data = {'auth_token': 'auth1', 'widget': 'id1', 'title': 'Something1', 'text': 'Some text', 'moreinfo': 'Subtitle'}
headers = {'Content-type': 'application/json'}
r = requests.post(url, data=json.dumps(data), headers=headers)
发送不起作用
POST / HTTP/1.1
Host: localhst:8123
Content-Length: 108
Content-type: application/json
Accept-Encoding: gzip, deflate, compress
Accept: */*
User-Agent: python-requests/2.0.1 CPython/2.7.0 Linux/2.6.35.14-106.fc14.i686
{"text": "Some text", "auth_token": "auth1", "moreinfo": "Subtitle", "widget": "id1", "title": "Something1"}
答案 0 :(得分:3)
Requests为您提供了在Python中处理HTTP请求的最简单但非常强大的方法。
也许尝试这样的事情:
import requests
import simplejson as json
url = "http://ip:port"
data = {'auth_token': 'auth1', 'widget': 'id1', 'title': 'Something1', 'text': 'Some text', 'moreinfo': 'Subtitle'}
headers = {'Content-type': 'application/json'}
r = requests.post(url, data=json.dumps(data), headers=headers)
如果API请求身份验证:
r = requests.post(url, data=json.dumps(data), headers=headers, auth=('user', 'pass'))
有关详细信息,请参阅[请求身份验证]。
答案 1 :(得分:2)
确定,使用Python-Requests是一个Python库,用于发送像Curl这样的请求。您可以查看Complicated Post Requests部分。
或者,如果你想在Python中使用curl,你可以使用pyCurl。
答案 2 :(得分:1)
为什么不使用urllib2?
import urllib2
import urllib
vsphere_dict = dict(
server_name="servername",
api_version=apiVersion,
guest_count=guestCount,
guest_on=guestOnLen,
guest_off=guestOffLen,
)
# create request object, set url and post data
req = urllib2.Request(some_url, data=urllib.urlencode(vsphere_dict))
# set header
req.add_header('Content-Type', 'application/json')
# send request
response = urllib2.urlopen(req)
UPD:
抱歉,我不明白是auth
和widget
。也许这也是POST数据?
HTTP错误500 - 可能意味着服务器未收到所有POST参数。
答案 3 :(得分:1)
在Dashing网站的示例中,他们使用:
curl -d '{ "auth_token": "YOUR_AUTH_TOKEN", "current": 100 }' http://localhost:3030/widgets/karma
在cURL手册页中,您可能需要将其发布为form-urlencoded吗?
-d, - data
(HTTP)将POST请求中的指定数据发送到HTTP服务器,就像用户填写HTML表单并按下提交按钮时浏览器一样。这将导致curl使用content-type application / x-www-form-urlencoded将数据传递到服务器。比较-F, - form。
-d, - data与--data-ascii相同。要纯数据二进制发布数据,您应该使用--data-binary选项。要对表单字段的值进行URL编码,您可以使用--data-urlencode。
如果在同一命令行中多次使用这些选项中的任何一个,则指定的数据将与分离& -symbol合并在一起。因此,使用'-d name = daniel -d skill = lousy'会生成一个看起来像'name = daniel& skill = lousy'的帖子块。
如果使用字母@开始数据,则其余部分应该是用于读取数据的文件名,或者 - 如果您希望curl从stdin读取数据。也可以指定多个文件。因此,可以使用--data @foobar从名为'foobar'的文件中发布数据。当--data被告知从这样的文件中读取时,回车符和换行符将被删除。
您可能还想尝试python-requests http://requests.readthedocs.org/en/latest/user/quickstart/#more-complicated-post-requests
更新:我开始工作了
import requests
import json
payload = {'auth_token': 'YOUR_AUTH_TOKEN', 'title': "pythontest"}
r = requests.post("http://localhost:3030/widgets/welcome", data=json.dumps(payload))
print r.text
您需要像表单一样发布json。