我正在用 Delphi 10.4 開發一個 Android 應用程式。我的客戶端通過 Web 服務與服務器通信。
我使用帶有 GET 方法的按名稱搜索服務來獲取名稱串列,具體取決于我輸入的字母(英語還是希臘語)TEdit。代碼行如下所示:
mydata := IdHTTP1.GET('http://.../Names/search/' Edit1.Text);
每次用戶在 中鍵入一個字母時都會呼叫該請求TEdit,并回傳以用戶鍵入的文本的第一個字母開頭的名稱。
當我使用英文字母時,搜索作業正常,但當我使用希臘字母時,它不能正常作業。相反,它回傳所有名稱串列1。
我在瀏覽器中嘗試使用希臘字母的路徑,如下所示:http://.../Names/search/Αντ,它可以作業,它回傳以 . 開頭的名稱Αντ。但在應用程式中,它不起作用。
TEditor組件的編碼是否有可能TIdHTTP是錯誤的?
就像它不讀取希臘字母并發送一個空字串。
1因為如果路徑是: http://.../Names/search/,它會回傳所有名稱串列。
我的代碼如下所示:
procedure TForm1.Edit1ChangeTracking(Sender: TObject);
var
mydata : string;
jsv,js : TJSONValue;
originalObj,jso : TJSONObject;
jsa : TJSONArray;
i: Integer;
begin
Memo1.Lines.Clear;
try
IdHTTP1.Request.ContentType := 'application/json';
IdHTTP1.Request.CharSet := 'utf-8';
IdHTTP1.Request.AcceptLanguage := 'gr';
IdHTTP1.Request.ContentEncoding := 'UTF-8';
mydata := IdHTTP1.Get('http://.../Names/search/' Edit1.Text);
except
on E: Exception do
begin
ShowMessage(E.Message);
end;
end;
try
jsv := TJSONObject.ParseJSONValue(TEncoding.UTF8.GetBytes(mydata),0) as TJSONValue;
try
jsa := jsv as TJSONArray;
for i := 0 to jsa.Size-1 do
begin
jso := jsa.Get(I) as TJSONObject;
js := jso.Get('Name').JsonValue;
Memo1.Lines.Add(js.Value);
if i=4 then // show the 5 first names of the search
break;
end;
finally
jsv.Free();
end;
except
on E: exception do
begin
ShowMessage(E.Message);
end;
end;
end;
uj5u.com熱心網友回復:
URL 不能包含未編碼的非 ASCII 字符。您不能TEdit按原樣附加文本,您需要對任何非 ASCII 字符以及 URI 規范保留的字符進行 url 編碼。
如果您使用瀏覽器的內置除錯器,您會看到它在將請求傳輸到服務器時實際上正在執行此編碼。例如,像這樣的 URL:http://.../Names/search/Αντ發送這樣的請求:
GET /Names/search/Αντ HTTP/1.1
Host: ...
...
通知Αντ=>Αντ
TIdURI在您的代碼中,您可以為此目的使用 Indy 的類,例如:
uses
..., IdURI;
mydata := IdHTTP1.GET('http://.../Names/search/' TIdURI.PathEncode(Edit1.Text));
附帶說明:
由于您正在發送 GET 請求,因此您不需要設定Request.ContentType、Request.CharSet或Request.ContentEncoding屬性(此外,無論如何'UTF-8'都無效)。ContentEncoding
此外,ParseJSONValue()有一個需要 a 的多載string,所以你不需要使用TEncoding.UTF8.GetBytes().
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/482789.html
上一篇:執行緒安全,這詞你懂了嗎?
