HTTP-Header dürfen keine Nicht-ASCII-Zeichen enthalten, nicht einmal UTF-8. Wenn Sie Nicht-ASCII-Zeichen in einem HTTP-Header senden müssen, müssen sie in einem ASCII-kompatiblen Format codiert sein.
In diesem Fall, da der Header in Frage JSON enthält, können Sie JSON eigene \uXXXX
Syntax für die Codierung von Nicht-ASCII-Zeichen verwenden:
Jeder Codepunkt als Hexadezimalzahl dargestellt werden kann. Die Bedeutung einer solchen Zahl wird durch ISO/IEC 10646 bestimmt. Wenn der Codepunkt in der Basic Multilingual Plane liegt (U + 0000 bis U + FFFF), dann kann er als sechsstellige Folge dargestellt werden: ein umgekehrter Solidus, gefolgt von dem Kleinbuchstaben u, gefolgt von vier hexadezimalen Ziffern, die den Codepunkt codieren. Hexadezimale Ziffern können Ziffern (U + 0030 bis U + 0039) oder die hexadezimalen Buchstaben A bis F in Großbuchstaben (U + 0041 bis U + 0046) oder Kleinbuchstaben (U + 0061 bis U + 0066) sein. So kann beispielsweise eine Zeichenkette, die nur ein einzelnes umgekehrtes Soliduszeichen enthält, als "\u005C
" dargestellt werden.
Zum Beispiel:
procedure TSaveFilterForm.TestButtonClick(Sender: TObject);
const
URL = 'https://content.dropboxapi.com/2/files/upload';
var
IdHTTP: TIdHTTP;
Source: TFileStream;
Res: String;
begin
IdHTTP := TIdHTTP.Create(nil);
try
IdHTTP.HandleRedirects := True;
IdHTTP.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(IdHTTP);
IdHTTP.Request.BasicAuthentication := False;
IdHTTP.Request.CustomHeaders.Values['Authorization'] := 'Bearer ' + AccessToken;
IdHTTP.Request.ContentType := 'application/octet-stream';
IdHTTP.Request.CustomHeaders.Values['Dropbox-API-Arg'] := Format(
'{ "path": "%s", "mode": "overwrite"}',
['/\u0444\u0430\u0439\u043B.txt']
);
Source := TFileStream.Create('c:\test.txt', fmOpenRead);
try
Res := IdHTTP.Post(URL, Source);
// alternatively, without using TFileStream manually:
// Res := IdHTTP.Post(URL, 'C:\test.txt');
finally
Source.Free;
end;
finally
IdHTTP.Free;
end;
end;
Ich schlage vor, Sie eine JSON-Bibliothek verwenden, um den JSON Inhalt zu erstellen. Zum Beispiel können Sie Delphi eigene JSON framework in Delphi 2010 verwenden und später, zum Beispiel:
uses
...,
// use DBXJSON in D2010-XE
// use Data.DBXJSON in XE2-XE5
// use System.JSON in XE6+
;
procedure TSaveFilterForm.TestButtonClick(Sender: TObject);
const
URL = 'https://content.dropboxapi.com/2/files/upload';
var
IdHTTP: TIdHTTP;
Json: TJSONObject;
Res: String;
begin
IdHTTP := TIdHTTP.Create(nil);
try
IdHTTP.HandleRedirects := True;
IdHTTP.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(IdHTTP);
IdHTTP.Request.BasicAuthentication := False;
IdHTTP.Request.CustomHeaders.Values['Authorization'] := 'Bearer ' + AccessToken;
IdHTTP.Request.ContentType := 'application/octet-stream';
Json := TJSONObject.Create;
try
Json.AddPair('path', '/файл.txt');
Json.AddPair('mode', 'overwrite');
IdHTTP.Request.CustomHeaders.Values['Dropbox-API-Arg'] := Json.ToJSON;
finally
Json.Free;
end;
Res := IdHTTP.Post(URL, 'C:\test.txt');
finally
IdHTTP.Free;
end;
end;
Es gibt viele 3rd-Party-JSON-Bibliotheken für Delphi, wenn Sie andere Delphi-Versionen unterstützen müssen.
[Delphi hat eine eigene JSON-Bibliothek] (http://docwiki.embarcadero.com/RADStudio/en/JSON). –
@Greg danke. Ich habe eine solche Lösung für Delphi gefunden - http://drcooper.livejournal.com/4186.html. –