使用Delphi Indy HTTP组件上载带有表单数据的文件
我想使用Indy在Delphi中复制这部分Python代码:使用Delphi Indy HTTP组件上载带有表单数据的文件,http,delphi,file-upload,indy,form-data,Http,Delphi,File Upload,Indy,Form Data,我想使用Indy在Delphi中复制这部分Python代码: postdata={'data':{“data”:{“xMode”:0,“overrideOS”:1,“messageId”:“vmProfileList”:“11”,“submitType”:“0”,“url”:“}”,filePriorityQ:“立即运行”} 文件_up={'amas_filename':打开('/home/samples/temp/vtest32.exe','r')} file\u upload\u req=r
postdata={'data':{“data”:{“xMode”:0,“overrideOS”:1,“messageId”:“vmProfileList”:“11”,“submitType”:“0”,“url”:“}”,filePriorityQ:“立即运行”}
文件_up={'amas_filename':打开('/home/samples/temp/vtest32.exe','r')}
file\u upload\u req=requests.post(url、postdata、files=file\u up、headers=headers、verify=False)
我这样试过:
Params.AddFormField('data','{“data”):{“xMode”:“+xMode+”,“analyzereach”:1,“overrideOS”:1,'+
““vmProfileList”:“+DBProfileID.Value+”,“submitType”:0,“url”:“}”);
Params.AddFile('amas_filename',DBTestFilePath.Value,GetMIMEType(DBTestFilePath.Value));
参数位置:=0;
HTTP1.Request.ContentType:=“application/x-www-form-urlencoded”;
JSON:=HTTP1.Post(URL,参数);
但它给了我一个HTTP错误“HTTP/1.0 400坏请求”,Web服务器说“坏请求。检查输入数据和负载大小”。我知道数据量足够小
这是来自客户端的请求和来自服务器的响应:
客户方说
POST /php/fileupload.php HTTP/1.0
Content-Type: multipart/form-data; boundary=--------031317093926335
Content-Length: 248815
VE-SDK-API: <<APIKEYWasHere>>
Host: Server_IP
Accept: application/vnd.ve.v1.0+json
Accept-Encoding: identity
User-Agent: Mozilla/3.0 - NBL
Cookie: PHPSESSID=<<Cookie_Was_Here>>
----------031317093926335
Content-Disposition: form-data; name="data"
Content-Type: text/plain
Content-Transfer-Encoding: quoted-printable
{"data":{"xMode": 0,"analyzeAgain":1,"overrideOS":1,"vmProfileList":"2=
4","submitType":0,"url":""},"filePriorityQ":"run_now"}
----------031317093926335
Content-Disposition: form-data; name="amas_filename"; filename="Process.exe"
Content-Type: application/x-msdownload
Content-Transfer-Encoding: binary
MZP
<<FileDataWasHere>>
POST/php/fileupload.php HTTP/1.0
内容类型:多部分/表单数据;边界=-----------031317093926335
内容长度:248815
VE-SDK-API:
主机:服务器IP
接受:application/vnd.ve.v1.0+json
接受编码:标识
用户代理:Mozilla/3.0-NBL
饼干:PHPSESSID=
----------031317093926335
内容配置:表单数据;name=“数据”
内容类型:文本/纯文本
内容传输编码:引用可打印
{“数据”:{“xMode”:0,“analyzereach”:1,“overrideOS”:1,“vmProfileList”:“2”=
4、“submitType”:0,“url:”},“filePriorityQ:“立即运行”}
----------031317093926335
内容配置:表单数据;name=“amas_filename”;filename=“Process.exe”
内容类型:应用程序/x-msdownload
内容传输编码:二进制
MZP
服务器服务说
HTTP/1.0 400 Bad Request
X-Content-Type-Options: nosniff
X-Content-Type-Options: nosniff
Cache-Control: no-store, no-cache, must-revalidate, private,max-age=0
Cache-Control: no-store, no-cache, must-revalidate, private,max-age=0
Pragma: no-cache
Pragma: no-cache
Expires: Sat, 26 Jul 1997 05:00:00 GMT
Content-type: text/html; charset=UTF-8
Content-Length: 89
Connection: close
Date: Mon, 13 Mar 2017 06:39:19 GMT
Server: Server FIPS
{"success":false,"errorMessage":"Bad Request. Check input data and payload size(<=200M)"}
HTTP/1.0 400错误请求
X-Content-Type-Options:nosniff
X-Content-Type-Options:nosniff
缓存控制:无存储,无缓存,必须重新验证,私有,最大年龄=0
缓存控制:无存储,无缓存,必须重新验证,私有,最大年龄=0
Pragma:没有缓存
Pragma:没有缓存
到期时间:1997年7月26日星期六格林尼治标准时间05:00:00
内容类型:text/html;字符集=UTF-8
内容长度:89
连接:关闭
日期:2017年3月13日星期一06:39:19 GMT
服务器:服务器FIPS
{“success”:false,“errorMessage”:“请求不正确。请检查输入数据和有效负载大小(下次您在与其他人的API交互时遇到问题,您应该指出该API的实际情况,以便人们有机会查看其文档,查看是否有任何内容丢失或错误。在这种情况下,您似乎正在使用
在您所显示的HTTP请求中,有几件事值得我注意:
HTTP1.Request.ContentType:=“应用程序/x-www-form-urlencoded”;
这完全是错误的。正确的内容类型是multipart/form data
。但是,TIdHTTP
在发布TIdMultipartFormDataStream
时会为您处理此问题,因此您不需要为请求分配值。ContentType
属性根本不会覆盖它。Bu但这并不能改变代码中存在bug的事实
接受编码:标识
这表明您正在使用一个旧版本的Indy。您应该考虑升级到一个更新近的版本。<代码> TIdHTTP <代码>不再在<代码>接受编码< /代码>请求头中发送<代码>身份> <代码>,除非<代码> TIDHTTP.Realth.Access编码属性包含其他值,这不是她的情况。e、 某些服务器在处理请求中明确声明的
接受编码:identity
时遇到问题,这就是默认情况下不再发送的原因
内容类型:文本/纯文本
JSON字段的内容类型应为application/JSON
,或者在此API中甚至可能是application/vnd.ve.v1.0+JSON
。如果未另行指定,默认值为text/plain
。AddFormField()
有一个用于此目的的aconttype
参数。web服务器可能对该值敏感。JSON通常也使用UTF-8编码,因此您也应该指出这一点。AddFormField()
有一个用于此目的的ACharset
参数
内容传输编码:引用可打印的
您的JSON字符串正在使用quoted printable
进行编码,这通常适用于MIME中的文本内容,但并非所有web服务器都在webform提交中处理该字符串,并且它可能不适用于非text/…
媒体类型,如JSON。AddFormField()
返回一个TIdFormDataField
对象。要禁用QP编码,可以将TIdFormDataField.ContentTransfer
属性设置为8bit
或binary
话虽如此,还是尝试一下类似的方法:
Params.AddFormField('data','{“data”):{“xMode”:“+xMode+”,“analyzereach”:1,“overrideOS”:1,'+
““vmProfileList”:“+DBProfileID.Value+”,“submitType”:0,“url”:“}}”,
‘utf-8’,
“应用程序/json”
).ContentTransfer:=“8位”;
//使用GetMIMEType()指定ContentType是多余的,因为
//AddFile()已经使用Indy自己的在内部为您完成了这项工作
//GetMIMETypeFromFile()函数。。。
Params.AddFile('amas_filename',DBTestFilePath.Value);
JSON:=HTTP1.Post(URL,参数);
如果这对您仍然不起作用,我建议您直接联系McAfee以获得进一步帮助。最好使用TIdMultipartFormDataStream
进行表单上载,请查看我的答案。@代码显然已经在使用TIdMultipartFormDataStream
,因为它正在调用AddFor