我在Delphi XE8中使用TidHTTP组件。我已经做了很多研究,这使我达到了这一点,因为TREST组件也没有完成这项工作。
...
RequestStream := TStringStream.Create(JSON.ToString, TEncoding.UTF8);
Params := TIdMultipartFormDataStream.Create;
try
Params.AddFormField( 'documentmetadata', 'application/json', 'utf-8', RequestStream);
Params.AddFile('content', FilePath, GetMIMETypeFromFile(FilePath));
FidHttp.Post(url, Params);
finally
RequestStream.Free;
Params.Free;
end;
...
我需要做的是发布内容类型为“multipart / mixed”的数据和文件。不幸的是,TIdMultipartFormDataStream总是创建“multipart / form-data”,第三方REST API不接受它。
有没有其他方法可以做到这一点?有人知道覆盖内容类型的方法吗?
此致 扬
答案 0 :(得分:0)
TIdMultipartFormDataStream
仅针对multipart/form-data
(因此得名)而设计,因此,将TIdMultipartFormDataStream
传递给TIdHTTP.Post()
硬编码TIdHTTP.Request.ContentType
到multipart/form-data
。没有选项可以覆盖 1 。
要执行您想要的操作,您必须手动生成自己的MIME数据,并将其存储在您选择的 {/ 1>}以外的TStream
中(例如{ {1}}),然后您可TIdMultipartFormDataStream
使用您想要的任何TMemoryStream
进行流式传输。例如:
Post()
1:话虽如此,我已尝试在TIdHTTP.Request.ContentType
中添加对用户定义的PostStream := TMemoryStream.Create;
try
// you may have to tweak this based on your REST provider's actual requirements...
WriteStringToStream(PostStream, '----myboundary' + EOL);
WriteStringToStream(PostStream, 'Content-Type: application/json; charset="utf-8"; name="documentmetadata"' + EOL);
WriteStringToStream(PostStream, EOL);
WriteStringToStream(PostStream, JSON.ToString, IndyTextEncoding_UTF8);
WriteStringToStream(PostStream, EOL + '----myboundary' + EOL);
WriteStringToStream(PostStream, 'Content-Type: ' + GetMIMETypeFromFile(FilePath) + '; name="content"' + EOL);
WriteStringToStream(PostStream, 'Content-Disposition: attachment; filename="' + ExtractFileName(FilePath) + '"' + EOL);
WriteStringToStream(PostStream, EOL);
FS := TFileStream.Create(FilePath, fmOpenRead or fmShareDenyWrite);
try
PostStream.CopyFrom(FS, 0);
finally
FS.Free;
end;
WriteStringToStream(PostStream, EOL + '----myboundary--' + EOL);
PostStream.Position := 0;
FidHttp.Request.ContentType := 'multipart/mixed; boundary="--myboundary"';
FidHttp.Post(url, PostStream);
finally
PostStream.Free;
end;
的支持,但未在Indy的主要代码行中检入这一次。