2017-02-16 146 views
0

我正在嘗試使用Delphi的Rest組件,並且在上傳流時卡住了。在Indy組件例如我需要添加MultiPartFormDataStream和我需要設置邊界的請求內容類型。但是,我不能在TRESTClient和TRESTRequest上重現它。 下面是代碼:如何使用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; 

當我嘗試執行我得到這個錯誤:

{code":400,"type":"unknown","message":"org.jvnet.mimepull.MIMEParsingException: Missing start boundary"}

這是作爲基礎來實現代碼的捲髮:

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. 目前我正在使用德爾福西雅圖,但以前我使用的是 德爾福X5和德爾福X5是不可能發送像我想要的 流。
  2. 我試圖使用PostMan和Advanced Rest Client(ARC,它是一個谷歌瀏覽器擴展)創建相同的場景。在PostMan上我可以使它工作,但在ARC上我不能。要檢查發送給我的RestApi的東西,我使用Fiddler from Telerik,這是一種wireshark,但對於RestClients。 有,我從提琴手得到了來自信息:

    郵遞員請求(即工作):

enter image description here

如果我使用德爾福這樣的代碼,我得到錯誤415 :

enter image description here

但如果我更改請求格式multipart_form_data,我得到這個錯誤,此輸出:

400
{"code":400,"type":"unknown","message":"org.jvnet.mimepull.MIMEParsingException: Missing start boundary"}

enter image description here

+0

Indy的'TIdMultiPartFormDataStream'生成一個隨機邊界。 'TIdHTTP.Post()'檢索該邊界並將其放入Content-Type頭中。 –

+0

'rCliTest.ContentType:='application/json';'是錯誤的。它應該是「multipart/form-data」。你沒有發送JSON文章。 –

回答

0

TRESTRequestParameterKind文檔:

pkREQUESTBODY: The parameter value will be used as a request body. If more than one parameter of this kind exists, the request will use a multi-part body.

嘗試一些更喜歡這個:

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; 
+0

我認爲這是一個版本問題。我正在使用Delphi XE5,並且沒有帶有參數的「AddItem」。我有這個: 函數AddItem:TRESTRequestParameter;超載;函數AddItem(const AName,AValue:string; AKind:TRESTRequestParameterKind; AOptions:TRESTRequestParameterOptions = []):TRESTRequestParameter; function AddItem(const AName,AValue:string):TRESTRequestParameter; (const AName,AValue:string; const AKind:TRESTRequestParameterKind; const AOptions:TRESTRequestParameterOptions; AContentType:TRESTContentType):TRESTRequestParameter; –

+0

「*我正在使用Delphi XE5 *」 - 這是本應包含在您的問題中的重要信息。 TBytes和TStream超載是在10.0西雅圖增加的。在XE5中,您可能無法發送包含文件的'multipart/form-data'文章。 –

+0

現在我正在德爾福西雅圖測試。 使用此代碼我得到錯誤415,不支持的媒體類型。 –

相關問題