2014-04-16 17 views
20

Tôi cố gắng để tái tạo các yêu cầu POST dưới, sử dụng các module yêu cầu trong python:yêu cầu python - POST multipart/form-data mà không cần tên tập tin trong yêu cầu 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-- 

Các tài liệu cho requests gợi ý rằng đối số file nên được dùng.

Khi tôi cố gắng gọi sau đây:

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

tôi nhận được yêu cầu HTTP sau:

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

Tôi cũng đã cố gắng sử dụng các tham số dữ liệu:

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

kết quả trong yêu cầu HTTP sau:

'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 

Vấn đề tôi gặp phải là sử dụng đối số tệp dẫn đến một cuộc gọi mà máy chủ không nhận ra, có lẽ do thông tin "tên tệp" không mong muốn được gửi trong yêu cầu HTTP. Sử dụng đối số dữ liệu sẽ gửi tiêu đề Loại Nội dung sai.

Yêu cầu đầu tiên được biết là đang hoạt động trên máy chủ mà tôi muốn gửi yêu cầu đến - cuộc gọi hàm chính xác để sao chép giống hệt yêu cầu HTTP đầu tiên là gì?

Edit: hình thức HTML mẫu để nhân rộng các yêu cầu làm việc:

<!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

Điều đó không giống như một 'form' tốt ... điều gì sẽ xảy ra nếu bạn thử:' requests.post ('http://example.com/example/asdfas', data = {'name': '12345' }) '? Máy chủ làm gì? – BorrajaX

+0

Biểu mẫu có thể không chuẩn. Tôi đã bao gồm HTML sẽ được yêu cầu để tạo một yêu cầu làm việc. Máy chủ trả về XML khi thành công hoặc lỗi không tìm thấy lỗi máy chủ trên các lỗi. – sornars

Trả lời

39

Các giải pháp là sử dụng các bộ khi đi qua các tham số để lập luận file:

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

trình như mong đợi:

'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

Rất thú vị! Bạn nên đánh dấu giải pháp của mình là được chấp nhận! (Tôi không biết bạn có thể đánh lừa mô-đun 'yêu cầu 'như thế) **: -) ** – BorrajaX

+6

@BorrajaX Heh, nó không lừa chúng tôi, nó chỉ là một góc không có giấy tờ của API của chúng tôi. Chúng tôi đang cố gắng quyết định xem chúng tôi có hài lòng với điều đó hay không trước khi chúng tôi ghi lại rõ ràng hơn. Bạn có thể sử dụng các bộ dữ liệu có độ dài bất kỳ từ 2 đến 4 và nó sẽ ảnh hưởng đến các phần khác nhau của phần tử đa phần. – Lukasa

+0

@sornars bao gồm các loại được đề cập, tôi cũng có, '------ WebKitFormBoundaryGTNXgIPxfTWUu45A Nội dung-Bố trí: biểu mẫu-dữ liệu; name = "files []"; filename = "myvideo.mp4" Loại nội dung: video/mp4 ------ WebKitFormBoundaryGTNXgIPxfTWUu45A - ' làm cách nào để chuyển tham số? xin vui lòng giúp – 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) 
Các vấn đề liên quan