如何使用TRestRequest设置多部分请求的边界?

时间:2017-02-16 16:33:01

标签: delphi

我正在尝试使用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'

更新

  1. 目前我正在使用Delphi Seattle,但之前我正在使用它 Delphi X5和Delphi X5不可能像I一样发送流 想。
  2. 我尝试使用PostMan和Advanced Rest Client(ARC,它是Google Chrome扩展程序)创建相同的方案。在PostMan上我可以使它工作,但在ARC我不能。要检查发送到我的RestApi的内容,我使用Fiddler from Telerik,这对于RestClients来说是一种wirehark。 我从Fiddler获得的信息来自:

    PostMan请求(有效):

  3. enter image description here

    如果我使用这样的Delphi代码,我会收到错误415:

    enter image description here

    但如果我将请求格式更改为multipart_form_data,我会收到此错误并输出:

      

    400
      { “代码”:400, “类型”: “未知”, “消息”:“org.jvnet.mimepull.MIMEParsingException:   缺少开始边界“}

    enter image description here

1 个答案:

答案 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;