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.ContentType
到 multipart/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 的主代码行中签入这次
我在 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.ContentType
到 multipart/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 的主代码行中签入这次