这与this帖子有关。我正在尝试使用TIdHTTP
和TIdMultiPartFormDataStream
发布一些表单数据,但在使用 Wireshark 监控通信时,每个表单字段都会获得{{ 1}}附加到它,由于某种原因,我发送这些东西的服务器不喜欢它。有没有办法可以确保只发送名称和值?
Content-Transfer也被添加,我可以使用以下内容删除它:
content-Type: text/plain
但我找不到任何摆脱内容类型的方法。 此时正在发送的数据如下所示(在Wireshark中)
aFieldItem := PostStream.AddFormField(fName, fValue);
aFieldItem.ContentTransfer := '';
我希望它看起来像:
Boundary: \r\n----------051715151353026\r\n
Encapsulated multipart part: (text/plain)
Content-Disposition: form-data; name="description"\r\n
Content-Type: text/plain\r\n
Line-based text data: text/plain
\r\n
Testing new AW Mobile
谢谢 萨姆
答案 0 :(得分:3)
HTML5 Section 4.10.22.7改变了RFC 2388如何应用于网络表单提交:
生成的multipart / form-data资源中与非文件字段对应的部分不得指定Content-Type标头。它们的名称和值必须使用上面选择的字符编码进行编码(特别是字段名称不会转换为RFC 2388中建议的7位安全编码)。
这与RFC 2388不同:
与所有多部分MIME类型一样,每个部分都有一个可选的" Content-Type",默认为text / plain。
您的服务器显然期待HTML5行为。
添加到Content-Type
的每个MIME部分的,则无法将其删除可以通过将TIdMultipartFormDataStream
标题是硬编码的,如果不更改TIdMultipartFormDataStream
的源代码TIdFormDataField.ContentType
属性设置为空格字符(不是空字符串,如ContentTransfer
属性允许)来省略:
aFieldItem := PostStream.AddFormField(fName, fValue);
aFieldItem.ContentTransfer := '';
aFieldItem.ContentType := ' '; // <-- here
如果将ContentType
属性设置为空字符串,则会将Content-Type
标头设置为application/octet-stream
,但是分配空格字符会产生副作用,即省略标题属性setter解析新值。
话虽如此,我已经对TIdMultipartFormDataStream
进行了一些更改,以解释HTML5中网络表单提交的这一变化,但我还没有最终确定并发布它。