Post 数据和文件到 REST-API 与 ContentType "multipart/mixed"

Post data and file to REST-API with ContentType "multipart/mixed"

我在 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;
    ...

我需要做的是 post 内容类型为 "multipart/mixed" 的数据和文件。不幸的是,TIdMultipartFormDataStream 总是创建 "multipart/form-data",这不被第 3 方 REST API.

接受

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

此致, 一月

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

要执行您想要的操作,您将必须手动生成自己的 MIME 数据并将其存储在您选择的TStream 而非 TIdMultipartFormDataStream(例如 TMemoryStream),然后您可以 Post() 使用您想要的任何 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;

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