我正在尝试使用Delphi的Rest组件,我在上传流时遇到困难。例如,在Indy组件上,我需要添加MultiPartFormDataStream,并且在Request Content Type上我需要设置边界。但是,我无法在TRESTClient和TRESTRequest上重现它。 这是代码:
//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;
当我尝试执行时,我收到此错误:
{代码 “:400,” 类型 “:” 未知 “ ”消息“:” org.jvnet.mimepull.MIMEParsingException: 缺少开始边界“}
这是用作实现代码的基础的卷发:
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'
更新:
我尝试使用PostMan和Advanced Rest Client(ARC,它是Google Chrome扩展程序)创建相同的方案。在PostMan上我可以使它工作,但在ARC我不能。要检查发送到我的RestApi的内容,我使用Fiddler from Telerik,这对于RestClients来说是一种wirehark。 我从Fiddler获得的信息来自:
PostMan请求(有效):
如果我使用这样的Delphi代码,我会收到错误415:
但如果我将请求格式更改为multipart_form_data,我会收到此错误并输出:
400
{ “代码”:400, “类型”: “未知”, “消息”:“org.jvnet.mimepull.MIMEParsingException: 缺少开始边界“}
答案 0 :(得分:0)
根据TRESTRequestParameterKind
文档:
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;