Delphi 如何使用TRestRequest设置多部分请求的边界?
我试图使用Delphi的Rest组件,但上传流时遇到了问题。例如,在Indy组件上,我需要添加MultiPartFormDataStream,在请求内容类型上,我需要设置边界。但是,我无法在TRESTClient和TRESTRequest上复制它。 代码如下:Delphi 如何使用TRestRequest设置多部分请求的边界?,delphi,Delphi,我试图使用Delphi的Rest组件,但上传流时遇到了问题。例如,在Indy组件上,我需要添加MultiPartFormDataStream,在请求内容类型上,我需要设置边界。但是,我无法在TRESTClient和TRESTRequest上复制它。 代码如下: //Fields rCliTest: TRESTClient; rReqTest: TRESTRequest; rRespTest: TRESTResponse; procedure TForm46.btn1Cl
//Fields
rCliTest: TRESTClient;
rReqTest: TRESTRequest;
rRespTest: TRESTResponse;
procedure TForm46.btn1Click(Sender: TObject);
var
StreamContent: TMemoryStream;
begin
StreamContent := TMemoryStream.Create;
img1.Picture.Graphic.SaveToStream(StreamContent);
rCliTest.BaseURL := 'http://petstore.swagger.io/v2/pet/33/uploadImage';
rCliTest.ContentType := 'application/json';
rReqTest.Method := TRESTRequestMethod.rmPOST;
rReqTest.AddParameter('additionalMetadata', 'Tets');
rReqTest.AddBody(StreamContent, ctMULTIPART_FORM_DATA);
rReqTest.Execute;
Caption := rRespTest.Content;
end;
curl -X POST --header 'Content-Type: multipart/form-data' --header 'Accept: application/json'
--header 'Authorization: Bearer 3d9979829200e7cc7e6e6ac039f75e01' -F additionalMetadata=rodrigo
'http://petstore.swagger.io/v2/pet/33/uploadImage'
当我尝试执行时,出现以下错误:
{code:400,“type”:“unknown”,“message”:“org.jvnet.mimepull.MIMEParsingException:
缺少起始边界“}
这是用作实现代码基础的卷曲:
//Fields
rCliTest: TRESTClient;
rReqTest: TRESTRequest;
rRespTest: TRESTResponse;
procedure TForm46.btn1Click(Sender: TObject);
var
StreamContent: TMemoryStream;
begin
StreamContent := TMemoryStream.Create;
img1.Picture.Graphic.SaveToStream(StreamContent);
rCliTest.BaseURL := 'http://petstore.swagger.io/v2/pet/33/uploadImage';
rCliTest.ContentType := 'application/json';
rReqTest.Method := TRESTRequestMethod.rmPOST;
rReqTest.AddParameter('additionalMetadata', 'Tets');
rReqTest.AddBody(StreamContent, ctMULTIPART_FORM_DATA);
rReqTest.Execute;
Caption := rRespTest.Content;
end;
curl -X POST --header 'Content-Type: multipart/form-data' --header 'Accept: application/json'
--header 'Authorization: Bearer 3d9979829200e7cc7e6e6ac039f75e01' -F additionalMetadata=rodrigo
'http://petstore.swagger.io/v2/pet/33/uploadImage'
更新:
{“code”:400,“type”:“unknown”,“message”:“org.jvnet.mimepull.MIMEParsingException: 缺少起始边界“} 根据文档: pkREQUESTBODY:参数值将用作请求正文。如果存在多个此类参数,请求将使用多部分正文 请尝试类似以下内容:
procedure TForm46.btn1Click(Sender: TObject);
var
StreamContent: TMemoryStream;
begin
StreamContent := TMemoryStream.Create;
try
img1.Picture.Graphic.SaveToStream(StreamContent);
StreamContent.Position:= 0;
rCliTest.BaseURL := 'http://petstore.swagger.io/v2/pet/33/uploadImage';
rCliTest.ContentType := 'multipart/form-data';
rReqTest.Method := TRESTRequestMethod.rmPOST;
rReqTest.AddParameter('additionalMetadata', 'Test',
TRESTRequestParameterKind.pkREQUESTBODY);
rReqTest.Params.AddItem('file', StreamContent,
TRESTRequestParameterKind.pkREQUESTBODY,
[TRESTRequestParameterOption.poDoNotEncode],
TRESTContentType.ctAPPLICATION_OCTET_STREAM);
rReqTest.Execute;
Caption := rRespTest.Content;
finally
StreamContent.Free;
end;
end;
Indy的
TIdMultiPartFormDataStream
生成一个随机边界。TIdHTTP.Post()
为您检索该边界并将其放入内容类型
标题中。rCliTest.ContentType:='application/json';
是错误的。它应该是'multipart/form data'
。您没有发送json帖子。我认为这是版本问题。我使用的是Delphi XE5,我没有“AddItem”“有三个参数。我有这个:函数AddItem:TRESTRequestParameter;超载;函数AddItem(const AName,AValue:string;AKind:TRESTRequestParameterKind;aooptions:TRESTRequestParameterOptions=[]):TRESTRequestParameter;函数AddItem(const AName,AValue:string):TRESTRequestParameter;函数AddItem(const AName,AValue:string;const AKind:TRESTRequestParameterKind;const aooptions:TRESTRequestParameterOptions;aconttype:TRESTContentType):TRESTRequestParameter;“我正在使用Delphi XE5”-这是应该包含在您的问题中的重要信息。10.0西雅图中添加了TBytes
和TStream
重载。在XE5中,您可能无法发送包含文件的多部分/表单数据post。使用此代码,我得到错误415,不支持的媒体类型。@RodrigoFariasRezino实际的HTTP请求是什么样子的?更糟糕的情况是,您可以放弃TRESTClient
,返回TIdHTTP
。我真的很想使用您的组件Remy,这些默认值。。。。。。。