【发布时间】:2017-07-05 21:37:13
【问题描述】:
我正在尝试使用 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;
当我尝试执行时出现此错误:
{code":400,"type":"unknown","message":"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'
更新:
- 目前我使用的是 Delphi Seattle,但之前我使用的是 Delphi X5 和 Delphi X5 无法像我一样发送流 想。
-
我尝试使用 PostMan 和 Advanced Rest Client(ARC,它是 google chrome 扩展程序)创建相同的场景。在 PostMan 上我可以让它工作,但在 ARC 上我不能。要检查发送到我的 RestApi 的内容,我使用 Fiddler from Telerik,这是一种线鲨,但适用于 RestClients。 我从 Fiddler 那里得到的信息来自:
PostMan 请求(有效):
如果我像这样使用 Delphi 代码,我会收到错误 415:
但如果我将请求格式更改为 multipart_form_data,我会收到此错误和以下输出:
400
{"code":400,"type":"unknown","message":"org.jvnet.mimepull.MIMEParsingException: 缺少起始边界"}
【问题讨论】:
-
Indy 的
TIdMultiPartFormDataStream生成随机边界。TIdHTTP.Post()检索该边界并将其放入您的Content-Type标头中。 -
rCliTest.ContentType := 'application/json';是错误的。应该是'multipart/form-data'。您没有发送 JSON 帖子。
标签: delphi