2013-06-19 55 views
2

翻譯我想知道我怎麼能翻譯下面的curl命令到Python:HOW TO curl命令到Python

捲曲-G -H 「接受:應用/ JSON」 'http://mydomain.com:8080/experimental/events' --data-進行urlencode '查詢= [ 「=」, 「certname」, 「MYSERVER」]'

我嘗試以下2個選項(1:使用httlib和2:使用的urllib2):

方法1:使用httlib

import httplib, urllib 
connection = httplib.HTTPConnection('mydomain.com', 8080) 
headers = {'Content-type': 'application/json'} 
values = {"query": "['=', 'certname', 'myserver']"} 
data = urllib.urlencode(values) 
connection.request('POST', '/experimental/events', data, headers) 
response = connection.getresponse() 

它不工作但如果我不無數據(用urlencode)一個簡單的請求它的工作原理如 connection.request( 'POST', '/事實/ MYSERVER' ,無,頭)

說明: '/實驗/事件' 需要--data-進行urlencode而是 '/事實/ MYSERVER' 不需要--data-進行urlencode

選項2:使用的urllib2

import urllib2, urllib 
values = {"query": "['=', 'certname', 'myserver']"} 
data = urllib.urlencode(values) 
url_path = "http://mydomain.com:8080/experimental/events" 
server_request = urllib2.Request(url_path, data) 
server_request.add_header('Content-type', 'Accept: application/json') 
server_response = urllib2.urlopen(server_request) 

它不工作但同樣,如果我做無數據(用urlencode)一個簡單的請求,諸如 url_path它工作= 「http://mydomain.com:8080/facts/myserver」,然後 server_request = urllib2.Request(url_path)

筆記:'/實驗/事件'的需求 - 數據urlencode但'事實/ myserver'不需要 - 數據urlencode

我與這種--data-urlencode'查詢= [「=」,「certname」,「myserver」]'

任何幫助,非常感謝!

+0

您是否嘗試過打印'data'字符串以查看它是否看起來如何?你也許可以捲曲來甩它。 –

回答

1

curl命令做一個GET:

$ curl -v -G -H "Accept: application/json" 'http://example.com/experimental/events' --data-urlencode 'query=["=", "certname", "myserver"]' 
* About to connect() to example.com port 80 (#0) 
* Trying 192.0.43.10... connected 
> GET /experimental/events?query=%5B%22%3D%22%2C%20%22certname%22%2C%20%22myserver%22%5D HTTP/1.1 
[...] 

the manual

-G,--get

使用時,此選項將與指定的所有數據 - d,--data或--data-binary在HTTP GET請求中使用,而不是在其他情況下將使用的POST請求中使用。這些數據將被附加到網址上,並帶有'?'分隔器。

但是Python版本正在做POST。如果你做了GET,它會起作用嗎?

url_path = "https://.../events?" + data 
server_request = urllib2.Request(url_path) 

兩者之間的唯一的其他不同的是,Python是編碼空格作爲+curl使用%20。他們應該被同等對待,但如果你的服務器寫的不好也可能是你的問題的原因:

import urllib2, urllib 
values = {"query": "['=', 'certname', 'myserver']"} 
data = urllib.urlencode(values) 
print(data) 

查詢=%5B%27%3D%27%2C +%27certname%27%2C +% 27myserver%27%5D

0

多麼有趣CurlPython被編碼的空間,結果都應該是相同的。 好收穫!

我取代的值,以

值= { '查詢': '[ 「=」, 「certname」, 「MYSERVER」]'}

然後產生什麼CurlPython被編碼和仍然看到Python是編碼空間爲+(不喜歡這個)

Curl

查詢=%5B%22%3D%22%2C%20%22certname%22%2C%20%22myserver%22%5D

Python

查詢=%5B% 22%3D%22%2C +%22certname%22%2C +%22myserver%22%5D

我 「固定」 使用Curl一個硬編碼的網址如下查詢的問題(代碼是不優雅但它現在正在工作:-))

import httplib 
connection = httplib.HTTPConnection('mydomain.com', 8080) 
headers = {'Content-type': 'application/json'} 
connection.request('GET', "/experimental/events?query=%5B%22%3D%22%2C%20%22certname%22%2C%20%22" + myserver + "%22%5D", None, headers) 
response = connection.getresponse() 

Brendan Long再次謝謝!