[英]from curl to pycurl - how to make a mutli-part post - works with curl, fails with 422 with pycurl
我有一個很好的cURL帖子:
curl -X POST http://some-server.com/working_endpoint-F "package[distro_version_id]=1" -F "package[package_file]=@/tmp/myfile.bin"
當我嘗試將其轉換為pycurl時,請求失敗,並顯示422 Unprocessable Entity,服務器說package[package_file]
“必須是多部分表單數據”
import pycurl
c = pycurl.Curl()
c.setopt(pycurl.VERBOSE, 1)
c.setopt(c.URL, 'http://some-server.com/working_endpoint')
c.setopt(c.POST, 1)
c.setopt(c.HTTPPOST, [('package[package_file]', (c.FORM_FILE, '/tmp/myfile.bin'))])
c.setopt(c.HTTPPOST, [('package[distro_version_id]', '1')])
c.perform()
實際上,標頭看起來像只有一個參數進入多部分形式
Content-Length: 165 Content-Type: multipart/form-data; boundary=------------------------dee07c93fad525aa
我究竟做錯了什么?
弄清楚了。
而不是像這樣對表單數據進行單獨的setopt調用
c.setopt(c.HTTPPOST, [('package[package_file]', (c.FORM_FILE, '/tmp/myfile.bin'))])
c.setopt(c.HTTPPOST, [('package[distro_version_id]', '1')])
它需要像這樣一個單一的結構
data = [
('package[distro_version_id]', '1'),
('package[package_file]', (
c.FORM_FILE, '/tmp/myfile.bin,
c.FORM_CONTENTTYPE, 'application/octet-stream'
))]
c.setopt(c.HTTPPOST, data)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.