2014-04-16 8 views
20

मैं अजगर में अनुरोध मॉड्यूल का उपयोग कर निम्नलिखित पोस्ट अनुरोध को दोहराने के लिए कोशिश कर रहा हूँ:अजगर अनुरोध - पोस्ट मल्टीपार्ट/HTTP अनुरोध में बिना फ़ाइल नाम के फार्म डेटा

POST /example/asdfas HTTP/1.1 
Host: example.com 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:28.0) Gecko/20100101 Firefox/28.0 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-US,en;q=0.5 
Accept-Encoding: gzip, deflate 
Connection: keep-alive 
Content-Type: multipart/form-data; boundary=---------------------------241652170216373 
Content-Length: 279 

-----------------------------241652170216373 
Content-Disposition: form-data; name="value_1" 

12345 
-----------------------------241652170216373 
Content-Disposition: form-data; name="value_2" 

67890 
-----------------------------241652170216373-- 

requests के लिए दस्तावेज़ पता चलता है कि फ़ाइलें तर्क होना चाहिए इस्तेमाल किया गया।

जब मैं निम्नलिखित कॉल प्रयास:

import requests 
requests.post('http://example.com/example/asdfas', files={'value_1': '12345', 
                  'value_2': '67890'}) 

मैं निम्नलिखित HTTP अनुरोध:

'Accept': '*/*', 
'Accept-Encoding': 'gzip, deflate, compress', 
'Content-Length': '264', 
'User-Agent': 'python-requests/2.2.1 CPython/3.3.2 Windows/7', 
'Content-Type': 'multipart/form-data; boundary=273f13699c02429db4eb95c97f757d38' 
--273f13699c02429db4eb95c97f757d38 
Content-Disposition: form-data; name="value_1"; filename="value_1" 

12345 
--273f13699c02429db4eb95c97f757d38 
Content-Disposition: form-data; name="value_2"; filename="value_2" 

67890 
--273f13699c02429db4eb95c97f757d38-- 

मैं भी डेटा तर्क का उपयोग करने की कोशिश की:

import requests 
requests.post('http://example.com/example/asdfas', data={'value_1': '12345', 
                 'value_2': '67890'}) 

जिसके परिणामस्वरूप निम्नलिखित HTTP अनुरोध में:

'Content-Type': 'application/x-www-form-urlencoded', 
'Content-Length': '27', 
'User-Agent': 'python-requests/2.2.1 CPython/3.3.2 Windows/7', 
'Accept': '*/*', 
'Accept-Encoding': 'gzip, deflate, compress' 
value_2=67890&value_1=12345 

मेरे पास जो मुद्दा है, वह है कि फाइल तर्क तर्क का उपयोग उस कॉल में होता है जो सर्वर पहचान नहीं करता है, संभावित रूप से HTTP अनुरोध में भेजी गई अप्रत्याशित "फ़ाइल नाम" जानकारी के कारण। डेटा तर्क का प्रयोग गलत सामग्री-प्रकार शीर्षलेख भेजता है।

पहला अनुरोध सर्वर पर काम करने के लिए जाना जाता है जिसे मैं अनुरोध भेजना चाहता हूं - पहले HTTP अनुरोध को समान रूप से दोहराने के लिए सही फ़ंक्शन कॉल क्या है? अपेक्षा के अनुरूप

import requests 
requests.post('http://example.com/example/asdfas', files={'value_1': (None, '12345'), 'value_2': (None, '67890')}) 

काम करता है::

संपादित करें:

<!DOCTYPE html> 
<html> 
<head> 
    <title></title> 
</head> 
<body> 
    <form action="http://example.com/example/asdfas" method="post" enctype="multipart/form-data"> 
     <label for="v1">Value 1</label> 
     <input id="v1" type="text" name="value_1"> 
     <label for="v2">Value 2</label> 
     <input id="v2" type="text" name="value_2"> 
     <input type="submit"> 
    </form> 
</body> 
</html> 
+0

यह एक अच्छा 'फॉर्म' जैसा नहीं दिखता है ... यदि आप कोशिश करते हैं तो क्या होता है: 'request.post (' http://example.com/example/asdfas ', data = {' name ':' 12345 ' }) '? सर्वर क्या करता है? – BorrajaX

+0

फॉर्म गैर-मानक हो सकता है। मैंने HTML शामिल किया है जिसे एक कार्य अनुरोध बनाने की आवश्यकता होगी। सर्वर सफलता पर एक्सएमएल देता है या यूआरएल विफलताओं पर सर्वर त्रुटि नहीं मिला है। – sornars

उत्तर

39

समाधान है जब फ़ाइलें तर्क को पैरामीटर प्रदान करने के लिए tuples उपयोग करने के लिए: नमूना HTML प्रपत्र काम कर अनुरोध को दोहराने के लिए

'Accept': '*/*', 
'Accept-Encoding': 'gzip, deflate, compress', 
'Content-Length': '228', 
'User-Agent': 'python-requests/2.2.1 CPython/3.3.2 Windows/7', 
'Content-Type': 'multipart/form-data; boundary=85e90a4bbb05474ca1e23dbebdd68ed9' 

--85e90a4bbb05474ca1e23dbebdd68ed9 
Content-Disposition: form-data; name="value_1" 

12345 
--85e90a4bbb05474ca1e23dbebdd68ed9 
Content-Disposition: form-data; name="value_2" 

67890 
--85e90a4bbb05474ca1e23dbebdd68ed9-- 
+2

अच्छा पकड़ो! आपको अपने समाधान को स्वीकार किए जाने के रूप में चिह्नित करना चाहिए! (मुझे नहीं पता था कि आप इस तरह के 'अनुरोध' मॉड्यूल को मूर्ख बना सकते हैं) **: -) ** – BorrajaX

+6

@ बोराजाएक्स हे, यह हमें बेवकूफ नहीं बना रहा है, यह हमारे एपीआई का सिर्फ एक अनियंत्रित कोने है। हम यह तय करने की कोशिश कर रहे हैं कि इससे पहले कि हम इसे अधिक स्पष्ट रूप से दस्तावेज करते हैं, हम उससे खुश हैं या नहीं। आप 2 और 4 के बीच किसी भी लंबाई के tuples का उपयोग कर सकते हैं, और यह multipart शरीर के विभिन्न हिस्सों को प्रभावित करेगा। – Lukasa

+0

@ उल्लिखित प्रकारों सहित, मेरे पास भी है, '------ WebKitFormBoundaryGTNXgIPxfTWUu45A सामग्री-विस्थापन: फ़ॉर्म-डेटा; नाम = "फाइलों []"; फ़ाइल नाम = "myvideo.mp4" सामग्री प्रकार: वीडियो/mp4 ------ WebKitFormBoundaryGTNXgIPxfTWUu45A - ' कैसे मैं पैरामीटर पारित करते हैं? कृपया – Shaardool

-2
import requests 
from requests_toolbelt import MultipartEncoder 

url = 'http://example.com/example/asdfas' 
fields = {'value_1':'12345', 'value_2': '67890'} 

data = MultipartEncoder(fields=fields) 
headers["Content-type"] = m.content_type 

requests.post(url=url, data=data, headers=headers) 
संबंधित मुद्दे