【发布时间】:2017-06-28 16:00:23
【问题描述】:
我正在尝试执行 Multipart upload to OneDrive using POST 并获得“HTTP/1.1 400 Bad Request”。标识日志文件:
统计连接。 发送 10.02.2017 12:50:08: POST /v1.0/drive/root::/children HTTP/1.0`代码:
procedure TSaveFilter.UploadTest;
const
URL = 'https://api.onedrive.com/v1.0/drive/root::/children';
Boundary = 'Boundary';
var
IdHTTP: TIdHTTP;
MemoryStream: TMemoryStream;
FileStream: TFileStream;
procedure WriteLnString(str: AnsiString; CRLF: Boolean = True);
begin
if CRLF then str := str + #13#10;
MemoryStream.Write(str[1], Length(str));
end;
begin
IdHTTP := TIdHTTP.Create(nil);
try
IdHTTP.HandleRedirects := True;
IdHTTP.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(IdHTTP);
IdHTTP.Request.BasicAuthentication := False;
IdHTTP.Request.CustomHeaders.Values['Authorization'] := 'Bearer ' + FAccessToken;
IdHTTP.Request.ContentType := Format('multipart/related; boundary="%s"', [Boundary]);
MemoryStream := TMemoryStream.Create;
try
WriteLnString('--' + Boundary);
WriteLnString('Content-ID: <metadata>');
WriteLnString('Content-Type: application/json');
WriteLnString('{"name":"Dest.txt", "file":{}, "@content.sourceUrl":"cid:content"}');
WriteLnString('--' + Boundary);
WriteLnString('Content-ID: <content>');
WriteLnString('Content-Type: application/octet-stream', False);
FileStream := TFileStream.Create('Source.txt', fmOpenRead);
try
MemoryStream.CopyFrom(FileStream, FileStream.Size);
finally
FileStream.Free;
end;
WriteLnString('--' + Boundary + '--', False);
IdHTTP.Post(URL, MemoryStream);
finally
MemoryStream.Free;
end;
finally
IdHTTP.Free;
end;
end;
我做错了什么?
这是一个有效的请求(列出孩子):
统计连接。 发送 10.02.2017 20:52:42: GET /v1.0/drive/root::/children?select=name,folder,file HTTP/1.1`【问题讨论】:
-
你试过 Fiddler2 捕获一个工作请求,并将它与 Delphi 请求进行比较吗?
-
@mjn 我使用 IdLogFile (Indy)。它捕获工作请求。
-
请也显示有效的 HTTP 请求
-
@mjn 工作请求太大,无法发表评论 - 在问题中添加。
-
抱歉不清楚。我想建议的是:使用不同的客户端,例如 C# 或 Java 版本。用它执行相同的请求,并捕获它的 HTTP 流量。然后,您可以将该工作请求与 Delphi 客户端的相同 HTTP 流量进行比较。
标签: delphi indy indy10 onedrive