2017-02-28 121 views
1

我從一個Perl腳本調用curl來發布文件:如何將`curl --data = @ filename`轉換爲Python請求?

my $cookie = 'Cookie: _appwebSessionId_=' . $sessionid; 
my $reply = `curl -s 
        -H "Content-type:application/x-www-form-urlencoded" 
        -H "$cookie" 
        --data \@portports.txt 
        http://$ipaddr/remote_api.esp`; 

我想使用Python requests模塊來代替。我試過以下Python代碼:

files = {'file': ('portports.txt', open('portports.txt', 'rb'))} 
headers = { 
    'Content-type' : 'application/x-www-form-urlencoded', 
    'Cookie' : '_appwebSessionId_=%s' % sessionid 
} 

r = requests.post('http://%s/remote_api.esp' % ip, headers=headers, files=files)  
print(r.text) 

但我總是得到響應「錯誤沒有找到請求中的數據」。我怎樣才能解決這個問題?

+0

爲什麼這個問題有一個Perl標籤? – Borodin

+0

@Borodin捲曲片段來自perl腳本 – AlexN

回答

0

files參數編碼的文件作爲一個多部分消息,這是不是你想要的。使用data參數,而不是:

import requests 

url = 'http://www.example.com/' 
headers = {'Content-Type': 'application/x-www-form-urlencoded'} 
cookies = {'_appwebSessionId_': '1234'} 

with open('foo', 'rb') as file: 
    response = requests.post(url, headers=headers, data=file, cookies=cookies) 
    print(response.text) 

這會產生類似的請求:

POST/HTTP/1.1 
Connection: keep-alive 
Accept: */* 
Accept-Encoding: gzip, deflate 
Host: www.example.com 
User-Agent: python-requests/2.13.0 
Content-Length: 15 
Content-Type: application/x-www-form-urlencoded 
Cookie: _appwebSessionId_=1234 

content of foo 

注意,在這兩種版本,並在原始curl命令,文件必須已經URL編碼。

+0

這工作。謝謝!我無法接受它作爲正確的答案,因爲我沒有足夠的代表在這個網站上。 – AlexN

+0

@AlexN太棒了,很高興它爲你工作。您可以接受任何代表級別的答案,直到15日才能得到答覆。請參閱[特權頁面](http://stackoverflow.com/help/privileges)。 – ThisSuitIsBlackNot

-1

第一個UTF-8解碼您的URL。

將標題和文件放入JSON對象中,減少all_data。

現在你的代碼應該看起來像這樣。

all_data = { 
    { 
     'file': ('portports.txt', open('portports.txt', 'rb')) 
    }, 
    { 
     'Content-type' : 'application/x-www-form-urlencoded', 
     'Cookie' : '_appwebSessionId_=%s' % sessionid 
    } 
} 


all_data = json.dumps(all_data) 
requests.post(url, data = all_data) 
+0

括號不對,應該在開始時有一個額外的括號: all_data = {{file ... 如果是這樣,那麼它會給出一個錯誤,說不可能的類型字典 – AlexN

+0

@Borodin在編輯代碼時仍然會顯示「不可用類型:字典」 – AlexN

+0

在發佈之前先嚐試json.dumps(all_data)。 –