Delphi 将“删除”;“内容类型”;来自TIdMultiPartFormDataStream

Delphi 将“删除”;“内容类型”;来自TIdMultiPartFormDataStream,delphi,indy,indy10,delphi-xe8,Delphi,Indy,Indy10,Delphi Xe8,这有点和post有关。我试图使用TIdHTTP和TIdMultiPartFormDataStream发布一些表单数据,但是当使用Wireshark监控通信时,每个表单字段都会附加一个内容类型:text/plain,出于某种原因,我发送这些内容的服务器不喜欢它。有没有办法确保只发送名称和值? 还添加了内容传输,我可以通过以下方式删除该内容: aFieldItem := PostStream.AddFormField(fName, fValue); aFieldItem.ContentTransfe

这有点和post有关。我试图使用
TIdHTTP
TIdMultiPartFormDataStream
发布一些表单数据,但是当使用Wireshark监控通信时,每个表单字段都会附加一个
内容类型:text/plain
,出于某种原因,我发送这些内容的服务器不喜欢它。有没有办法确保只发送名称和值? 还添加了内容传输,我可以通过以下方式删除该内容:

aFieldItem := PostStream.AddFormField(fName, fValue);
aFieldItem.ContentTransfer := '';
但我找不到任何摆脱内容类型的方法。 此时正在发送的数据如下所示(在Wireshark中)

我希望它看起来像:

Boundary: \r\n------WebKitFormBoundary32hCBG8zkGMBpxqL\r\n
Encapsulated multipart part:
    Content-Disposition: form-data; name="description"\r\n
    Data (21 bytes)
        Data: 0d0a5465737420616e6420747261636520636f6d6d
        Length: 21
多谢各位 Sam改变了应用于网络表单提交的方式:

生成的多部分/表单数据资源中与非文件字段相对应的部分不得指定内容类型头。它们的名称和值必须使用上面选择的字符编码进行编码(尤其是字段名称,不能按照RFC 2388中的建议转换为7位安全编码)

这与RFC 2388不同:

与所有多部分MIME类型一样,每个部分都有一个可选的“内容类型”,默认为text/plain

您的服务器显然期待HTML5的行为

添加到
TIdMultipartFormDataStream
的每个MIME部件上的
Content-Type
头是硬编码的,如果不更改
TIdMultipartFormDataStream
的源代码,可以通过将
tidmultipartformdatafield.ContentType
属性设置为空格字符来省略(不是空字符串,如
ContentTransfer
属性所允许的):

aFieldItem:=PostStream.AddFormField(fName,fValue);
aFieldItem.ContentTransfer:='';
aFieldItem.ContentType:='';//更改应用于Web表单提交的方式:

生成的多部分/表单数据资源中与非文件字段相对应的部分不得指定内容类型头。必须使用上面选择的字符编码对其名称和值进行编码(尤其是字段名称,不能按照RFC 2388中的建议转换为7位安全编码)

这与RFC 2388不同:

与所有多部分MIME类型一样,每个部分都有一个可选的“内容类型”,默认为text/plain

您的服务器显然期待HTML5的行为

添加到
TIdMultipartFormDataStream
的每个MIME部件上的
Content-Type
头是硬编码的,如果不更改
TIdMultipartFormDataStream
的源代码,可以通过将
tidmultipartformdatafield.ContentType
属性设置为空格字符来省略(不是空字符串,如
ContentTransfer
属性所允许的):

aFieldItem:=PostStream.AddFormField(fName,fValue);
aFieldItem.ContentTransfer:='';

aFieldItem.ContentType:='';//谢谢。关于我如何处理这一问题,您有什么建议吗?正如我所说,您必须更改TIdMultipartFormDataStream的源代码,然后重新编译Indy。或者,将其源代码复制到项目中的新单元/类,然后根据需要进行更改。或者只需将自己的MIME数据写入其中标准TStream,如TMemoryStream。我不知道新的TIdMultipartFormDataStream何时可以发布。第三个选项(将数据MIME到标准TStream,如TMemoryStream)听起来很好。你有这样做的例子吗?我需要发布一组名称-值对和一个文件以及结尾。谢谢。实际上我发现了一个使其工作的例子。这里讨论了使
TIdMultipartFormDataStream
与HTML5服务器一起工作所需的更改:谢谢。关于如何处理的任何建议同时?正如我所说,您必须更改TIdMultipartFormDataStream的源代码,然后重新编译Indy。或者,将其源代码复制到项目中的一个新单元/类,然后根据需要进行更改。或者只需将您自己的MIME数据写入一个标准的TStream,例如TMemoryStream。我不知道新的TIdMul何时运行tipartFormDataStream即将发布。第三个选项(将数据MIME到标准的TStream中,如TMemoryStream)听起来很好。你有这样做的例子吗?我需要发布一组名称-值对和一个文件以及结尾。谢谢。实际上,我发现了一个使其工作的例子。这里讨论了使
TIdMultipartFormDataStream
与HTML5服务器一起工作所需的更改:
Boundary: \r\n------WebKitFormBoundary32hCBG8zkGMBpxqL\r\n
Encapsulated multipart part:
    Content-Disposition: form-data; name="description"\r\n
    Data (21 bytes)
        Data: 0d0a5465737420616e6420747261636520636f6d6d
        Length: 21
aFieldItem := PostStream.AddFormField(fName, fValue);
aFieldItem.ContentTransfer := '';
aFieldItem.ContentType := ' '; // <-- here