2017-02-16 7 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. В настоящее время я использую Delphi Сиэтл, но раньше я использовал Delphi X5 и в Delphi X5 не представляется возможным направлять поток, как я хочу.
  2. Я попытался создать тот же сценарий, используя PostMan и Advanced Rest Client (ARC, это расширение для google chrome). На PostMan я мог бы заставить его работать, но на ARC я не мог. Чтобы проверить, что было отправлено на мой RestApi, я использую Fiddler from Telerik, это своего рода проводка, но для RestClients. Есть информация, которую я получил от Скрипач из: Почтальон Запрос

    (который работал):

enter image description here

Если я использую код Delphi, как это, я получаю сообщение об ошибке 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

Инди '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» с параметрами.У меня есть: function AddItem: TRESTRequestParameter; перегрузки; Функция AddItem (const AName, AValue: строка; AKind: TRESTRequestParameterKind; AOptions: TRESTRequestParameterOptions = []): TRESTRequestParameter; Функция AddItem (const AName, AValue: строка): TRESTRequestParameter; Функция AddItem (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

Теперь я тестирую на Delphi Seattle. Используя этот код, я получаю ошибку 415, неподдерживаемый тип носителя. –