我正在 Delphi 10.4中开发一个Android应用程序。我的客户端通过Web服务与服务器通信。
我使用一个带有GET方法的按名字搜索服务,根据我在TEdit
中键入的字母(英语或希腊语)来获取一个名字列表。
mydata := IdHTTP1.GET('http://.../Names/search/'+Edit1.Text);
每次使用者在TEdit
中输入字母时,就会呼叫要求,并传回以使用者所输入文字的第一个字母开头的名称。
当我使用英语字母时,搜索工作正常,但当我使用希腊字母时,它就不能正常工作了。相反,它返回所有的名字列表。
我尝试在浏览器中使用希腊字母的路径,如下所示:http://.../Names/search/Αντ
,它可以工作,它返回以Αντ
开头的名称。但在应用程序中,它不工作。
是否可能是TEdit
或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;
1条答案
按热度按时间i34xakig1#
URL不能包含 unencoded 非ASCII字符。您不能只按原样追加
TEdit
文本,您需要对任何非ASCII字符以及URI规范中保留的字符进行URL编码。如果您使用浏览器的内置调试器,您将看到在向服务器传输请求时,它实际上正在进行这种编码。例如,一个URL如下:
http://.../Names/search/Αντ
发送如下请求:注意
Αντ
=〉%CE%91%CE%BD%CF%84
在您的代码中,您可以使用Indy的
TIdURI
类来实现此目的,例如:顺便说一句:
由于您发送的是GET请求,因此不需要设置
Request.ContentType
、Request.CharSet
或Request.ContentEncoding
属性(此外,'UTF-8'
对于ContentEncoding
也是无效的)。另外,
ParseJSONValue()
有一个重载,它需要一个string
,所以你不需要使用TEncoding.UTF8.GetBytes()
。