簡體   English   中英

從curl到pycurl-如何制作多部分零件-與curl配合使用pycurl失敗422

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM