0

这与这篇文章有点相关。我正在尝试使用TIdHTTPand发布一些表单数据TIdMultiPartFormDataStream,但是在使用Wireshark监视通信时,每个表单字段都会content-Type: text/plain附加到它,并且由于某种原因,我将这些东西发送到的服务器不喜欢它。有没有办法可以确保只发送名称和值?内容传输也被添加,我可以使用以下方法删除它:

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

但我找不到任何方法来摆脱内容类型。此时正在发送的数据看起来像这样(在 Wireshark 中)

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

我希望它看起来像:

Boundary: \r\n------WebKitFormBoundary32hCBG8zkGMBpxqL\r\n
Encapsulated multipart part:
    Content-Disposition: form-data; name="description"\r\n
    Data (21 bytes)
        Data: 0d0a5465737420616e6420747261636520636f6d6d
        Length: 21

谢谢山姆

4

1 回答 1

4

HTML5 第 4.10.22.7 节更改了RFC 2388如何应用于 Web 表单提交:

生成的 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,但分配一个空格字符会产生副作用,即在属性设置器解析新值时忽略标头。

话虽如此,我已经对TIdMultipartFormDataStreamHTML5 中 Web 表单提交的这种变化进行了一些更改,但我还没有最终确定并发布它。

于 2015-05-18T00:57:42.257 回答