【问题标题】:How can I set boundary of Content-type using python requests?如何使用 python 请求设置内容类型的边界?
【发布时间】:2018-12-18 05:24:56
【问题描述】:
POST /write.php HTTP/1.1
HOST: upload.sitename.com
accept-encoding: gzip, deflate
content-length: 788
content-type: multipart/form-data; boundary=----WebKitFormBoundarycHb9L3gZr8gzENfz
referer: http://www.sitename.com
user-agent: sitename.app

------WebKitFormBoundarycHb9L3gZr8gzENfz
Content-Disposition: form-data; name="app_id";

123123123123
------WebKitFormBoundarycHb9L3gZr8gzENfz
Content-Disposition: form-data; name="id";

idididid
------WebKitFormBoundarycHb9L3gZr8gzENfz
Content-Disposition: form-data; name="mode";

write
------WebKitFormBoundarycHb9L3gZr8gzENfz
Content-Disposition: form-data; name="subject";

subject
------WebKitFormBoundarycHb9L3gZr8gzENfz
Content-Disposition: form-data; name="user_id";

456456456456
------WebKitFormBoundarycHb9L3gZr8gzENfz
Content-Disposition: form-data; name="memo_block[0]";

memoblock
------WebKitFormBoundarycHb9L3gZr8gzENfz--

我想用 python 发送这个请求。

import requests
from email.mime.multipart import MIMEMultipart

related = MIMEMultipart('form-data','----WebKitFormBoundary6o6EZLygJtLbQhjb')

headers = dict(related.items())
headers['User-Agent'] = 'sitename.app'
headers['referer'] = 'http://www.sitename.com'

files = {
    'app_id':(None, '123123'),
    'id':(None, 'idid'),
    'mode':(None, 'write'),
    'subject':(None, 'subject'),
    'user_id':(None, '456456'),
    'memo_block[0]':(None, 'memoblock')
}

req = requests.post('http://upload.sitename.com/_app_write_api.php', files=files, headers=headers)
print(req.status_code)

所以,我写了这样的代码。

我使用 Wire Shark 识别了请求,但这不是我想要的。

POST /_app_write_api.php HTTP/1.1
Host: upload.sitename.com
User-Agent: sitename.app
Accept-Encoding: gzip, deflate
Accept: */*
Connection: keep-alive
Content-Type: multipart/form-data; boundary="----WebKitFormBoundary6o6EZLygJtLbQhjb"
MIME-Version: 1.0
referer: http://www.sitename.com
Content-Length: 680

--e68a0877353c411b8972ec5f868b2e41
Content-Disposition: form-data; name="app_id"

123123
--e68a0877353c411b8972ec5f868b2e41
Content-Disposition: form-data; name="id"

idid
--e68a0877353c411b8972ec5f868b2e41
Content-Disposition: form-data; name="mode"

write
--e68a0877353c411b8972ec5f868b2e41
Content-Disposition: form-data; name="subject"

subject
--e68a0877353c411b8972ec5f868b2e41
Content-Disposition: form-data; name="user_id"

456456
--e68a0877353c411b8972ec5f868b2e41
Content-Disposition: form-data; name="memo_block[0]"    

memoblock
--e68a0877353c411b8972ec5f868b2e41--

实际上像这样发送请求。 服务器向我发送响应“错误”。

我认为这是因为 '--e68a0877353c411b8972ec5f868b2e41'。

我该如何设置?或者我可以随机设置边界吗?

【问题讨论】:

    标签: python python-requests multipart boundary


    【解决方案1】:

    python requests - POST Multipart/form-data without filename in HTTP request 有关在元组中添加 None 的原因,请参阅此解决方案。这主要是因为您需要将“file_name”设置为None。

    【讨论】:

    • 由于这不能回答手头的问题,如果将其写成评论而不是答案会更好
    【解决方案2】:

    这是因为 header 值 ----WebKitFormBoundary6o6EZLygJtLbQhjb 和 body --e68a0877353c411b8972ec5f868b2e41 不匹配。发送multipart/form-data你不需要设置标题Content-Type

    import requests
    
    headers = {
        'User-Agent' : 'sitename.app',
        'referer' : 'http://www.sitename.com'
    }
    
    files = {
        'app_id':(None, '123123'),
        'id':(None, 'idid'),
        'mode':(None, 'write'),
        'subject':(None, 'subject'),
        'user_id':(None, '456456'),
        'memo_block[0]':(None, 'memoblock')
    }
    
    req = requests.post('http://upload.sitename.com/_app_write_api.php', files=files, headers=headers)
    print(req.status_code)
    

    【讨论】:

    • 为什么要在那些元组中插入None
    • 您的特定标题确实有效。在一些多部分查询中,“User-Agent”和“referer”更为重要。
    猜你喜欢
    • 2013-09-01
    • 2012-04-07
    • 1970-01-01
    • 1970-01-01
    • 2013-09-09
    • 2015-02-28
    • 2017-07-05
    • 2018-05-26
    • 2011-07-24
    相关资源
    最近更新 更多