【问题标题】:Post data and file to REST-API with ContentType "multipart/mixed"使用 ContentType "multipart/mixed" 将数据和文件发布到 REST-API
【发布时间】:2018-05-24 15:38:24
【问题描述】:

我在 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”,第 3 方 REST API 不接受。

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

问候, 一月

【问题讨论】:

    标签: delphi indy


    【解决方案1】:

    TIdMultipartFormDataStream 专门为multipart/form-data 设计(因此得名),因此,将TIdMultipartFormDataStream 传递给TIdHTTP.Post()TIdHTTP.Request.ContentType 硬编码为multipart/form-data。没有选项可以覆盖 1

    要做您想做的事,您必须手动生成自己的 MIME 数据并将其存储在您选择的TStream TIdMultipartFormDataStream(例如TMemoryStream),然后你可以用你想要的任何TIdHTTP.Request.ContentTypePost() 那个流。例如:

    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;
    

    1:话虽如此,我已经尝试在TIdMultipartFormDataStream 中添加对用户定义的ContentType 的支持,但目前尚未签入Indy 的主代码行。

    【讨论】:

      猜你喜欢
      • 2020-02-11
      • 2019-03-21
      • 2016-02-10
      • 2013-11-23
      • 2019-01-05
      • 2020-11-06
      • 1970-01-01
      • 1970-01-01
      • 2021-12-09
      相关资源
      最近更新 更多