Публикация данных и файлов в REST-API с ContentType «multipart / mixed» - PullRequest
0 голосов
/ 24 мая 2018

Я использую компонент TidHTTP в Delphi XE8.Я уже провел много исследований, которые привели меня к этому вопросу, потому что 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"/ смешанный».К сожалению, TIdMultipartFormDataStream всегда создает «multipart / form-data», что не принимается сторонним REST API.

Есть ли альтернативный способ сделать это?Кто-нибудь знает способ переопределения типа контента?

С уважением, Ян

1 Ответ

0 голосов
/ 24 мая 2018

TIdMultipartFormDataStream специально разработан только для multipart/form-data (отсюда и его название) и, таким образом, передает жесткие коды от TIdMultipartFormDataStream до TIdHTTP.Post() от TIdHTTP.Request.ContentType до multipart/form-data.Нет возможности перезаписать это 1 .

. Чтобы сделать то, что вы хотите, вам придется вручную создавать свои собственные данные MIME и сохранять их в TStream по вашему выбору * 1012.* кроме 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: При этом я экспериментировал с добавлением поддержки пользовательского ContentType в TIdMultipartFormDataStream, но это не проверено в основной кодовой строке Indy.в это время.

...