使用ContentType“multipart / mixed”将数据和文件发布到REST-API

时间:2018-05-24 15:38:25

标签: delphi indy

我在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不接受它。

有没有其他方法可以做到这一点?有人知道覆盖内容类型的方法吗?

此致 扬

1 个答案:

答案 0 :(得分:0)

TIdMultipartFormDataStream仅针对multipart/form-data(因此得名)而设计,因此,将TIdMultipartFormDataStream传递给TIdHTTP.Post()硬编码TIdHTTP.Request.ContentTypemultipart/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的主要代码行中检入这一次。