2017-03-24 48 views
0

试图复制卷曲请求的设备API的Python请求蟒蛇请求POST到API - 复制卷曲

curl -qgsSkH "Content-Type: multipart/form-data" 
--no-progress-bar 
--header "X-Api-Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" 
-F "[email protected]/c/tmp/test.txt" 
-F "options={\"application\":\"2\",\"timeout\":\"500\",\"priority\":\"0\", 
\"profiles\":[\"win7-sp1\"],\"analysistype\":\"0\",\"force\":\"true\", 
\"prefetch\":\"0\"}" 
https://xxx.xxx.xxx.xxx:443/apis/v1.1.0/submissions 

我已经succefully认证的API,可以在POST请求使用收到的令牌。我目前的python函数如下所示。

def api_file_submit(api_token, file_name): 
login_headers = {'X-Api-Token': api_token, 'Accept': 'application/json', 'Content-Type': 'multipart/form-data'} 
files = {"filename": open(file_name, 'rb')} 
sub_options = {"application": "-1", "timeout": "240", "priority": "0", "profiles": ["Win7 Sp1"], 
       "analysistype": "0", "force": "false", "prefetch": "value"} 
j = simplejson.dumps(sub_options) 
data = {'options': j} 
r = requests.post(api_submit, headers=login_headers, files=files, data=data, verify=False) 
print "REQUEST HEADER: " + str(r.request.headers) 
print "REQUEST BODY: " + str(r.request.body) 
print "RESPONSE HEADER: " + str(r.headers) 
print "RESPONSE CONTENT: " + str(r.content) 
print "RESPONSE STATUS: " + str(r.status_code) 
print "RESPONSE REASON: " + str(r.reason) 
return 

该API在尝试POST时返回HTTP 400错误请求。下面是函数

REQUEST HEADER: {'Content-Length': '424', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/json', 'User-Agent': 'python-requests/2.11.1', 'Connection': 'keep-alive', 'X-Api-Token': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 'Content-Type': 'multipart/form-data'} 
REQUEST BODY: --63a06536e02c4479a846c5fe320cdf7f 
Content-Disposition: form-data; name="options" 

{"force": "false", "profiles": ["Win7 Sp1"], "priority": "0", "application": "-1", "prefetch": "value", "timeout": "240", "analysistype": "0"} 
--63a06536e02c4479a846c5fe320cdf7f 
Content-Disposition: form-data; name="filename"; filename="test.vbs" 

x = msgbox("this is an test file", 0, "test file") 
--63a06536e02c4479a846c5fe320cdf7f-- 

RESPONSE HEADER: {'Content-Length': '257', 'Expires': '0', 'Connection': 'close', 'Pragma': 'no-cache', 'Cache-Control': 'no-cache, no-store, must-revalidate', 'Date': 'Fri, 24 Mar 2017 17:11:47 GMT', 'X-Frame-Options': 'DENY', 'Content-Type': 'application/json;charset=ISO-8859-1'} 
RESPONSE CONTENT: {"apis":{"@version":"v1.1.0","description":"Error parsing options, please check you have provided a file for upload and included 'options' in json format as part of request","errorCode":"BESUB1001","httpStatus":400,"message":"Could not parse input"}} 
RESPONSE STATUS: 400 
RESPONSE REASON: Bad Request 

Process finished with exit code 0 

我缺少的是正确格式的请求,并提交文件,复制上述卷曲请求的结果?

+0

我建议你=文件添加一个文件到您的POST请求,并删除它来自数据领域。 http://stackoverflow.com/questions/22567306/python-requests-file-upload – Artagel

回答

0

打开的文件,而不是一个字典,刚把手 格式化选项,JSON,并列入“文件”

def api_file_submit(api_token, file_name): 
login_headers = {'X-Api-Token': api_token, 'Accept': '*/*'} 
files = open(file_name, 'rb') 
sub_options = {'application': '0', 'timeout': '240', 'priority': '0', 'profiles': ['win7-sp1'], 'analysistype': '2', 'force': 'false', 'prefetch': '1'} 
submissionData = ('', json.dumps(sub_options), 'application/json') 
files = {'options': submissionData, 'filename': files} 
r = requests.post(api_submit, headers=login_headers, files=files, verify=False)