2013-11-26 103 views
3

我真的試圖在蟒蛇的2個請求:發送數據捲曲/ Json的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發送它們嗎?

更新:

我無法處理的部分是通過身份驗證和小部件。我曾嘗試沒有成功如下:

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:內部服務器錯誤」

任何想法如何,我可以通過身份驗證和正確工具?

UPDATE:

要看到的是不同的我已經開始在當地一個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

你使用了子進程模塊嗎? –

回答

2

那麼肯定的是,使用Python,請求這是一個Python庫發送請求像捲曲。您可以查看Complicated Post Requests部分。或者,如果您想在Python中使用捲曲,則可以使用pyCurl

+0

Auth和Widget是我用來向服務器進行身份驗證的惡意軟件。我需要將它們作爲前兩個參數發送並稍後發送數據。仍然沒有運氣 – Spanglish

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:

對不起,我用不明白,是authwidget。也許這也是POST數據? HTTP錯誤500 - 可能表示服務器收到的不是所有POST參數。

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')) 

參見[請AUTH]瞭解詳情。

+0

這似乎是完美的,但並沒有解決問題。我得到了:>>> r.reason '未經授權' – Spanglish

+0

也許您要發佈的API請求驗證?如果是這樣,請參閱[認證](http://www.python-requests.org/en/latest/user/authentication/),並且不要忘記接受答案:) –

+0

將BasicAuth示例添加到答案中。 –

1

在從短跑網站的例子,他們使用:

curl -d '{ "auth_token": "YOUR_AUTH_TOKEN", "current": 100 }' http://localhost:3030/widgets/karma 

來自卷邊手冊頁,也許你需要將它張貼作爲窗體-urlencoded?

-d,--data

(HTTP)發送在POST請求中向HTTP服務器指定的數據,以相同的方式,當用戶填補在HTML表單並按下瀏覽器不提交按鈕。這將導致curl使用內容類型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從標準輸入讀取數據。還可以指定多個文件。因此,從名爲'foobar'的文件發佈數據將使用--data @foobar完成。當--data被告知從這樣的文件讀取時,回車符和換行符將被刪除。

您也可能想嘗試的python-請求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。