Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何使用TRestRequest设置多部分请求的边界?_Delphi - Fatal编程技术网

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

Delphi 如何使用TRestRequest设置多部分请求的边界?,delphi,Delphi,我试图使用Delphi的Rest组件,但上传流时遇到了问题。例如,在Indy组件上,我需要添加MultiPartFormDataStream,在请求内容类型上,我需要设置边界。但是,我无法在TRESTClient和TRESTRequest上复制它。 代码如下: //Fields rCliTest: TRESTClient; rReqTest: TRESTRequest; rRespTest: TRESTResponse; procedure TForm46.btn1Cl

我试图使用Delphi的Rest组件,但上传流时遇到了问题。例如,在Indy组件上,我需要添加MultiPartFormDataStream,在请求内容类型上,我需要设置边界。但是,我无法在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;
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'

更新

  • 目前我正在使用Delphi Seattle,但之前我使用的是 Delphi X5和Delphi X5不可能像I一样发送流 需要
  • 我尝试使用和高级Rest客户端(ARC,它是google chrome的扩展)创建相同的场景。在PostMan上我可以让它工作,但在ARC上我不能。要检查发送到我的RestApi的内容,我使用的是wireshark,但对于RestClient。 以下是我从Fiddler那里得到的信息:

    邮递员请求(有效):

  • 如果我像这样使用Delphi代码,我会得到错误415:

    但是,如果我将请求格式更改为multipart_form_data,我会得到以下错误和输出:

    400
    {“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,这些默认值。。。。。。。