delphi 在GET请求的URL中使用希腊字母

7cwmlq89  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(123)

我正在 Delphi 10.4中开发一个Android应用程序。我的客户端通过Web服务与服务器通信。
我使用一个带有GET方法的按名字搜索服务,根据我在TEdit中键入的字母(英语或希腊语)来获取一个名字列表。

mydata := IdHTTP1.GET('http://.../Names/search/'+Edit1.Text);

每次使用者在TEdit中输入字母时,就会呼叫要求,并传回以使用者所输入文字的第一个字母开头的名称。
当我使用英语字母时,搜索工作正常,但当我使用希腊字母时,它就不能正常工作了。相反,它返回所有的名字列表。
我尝试在浏览器中使用希腊字母的路径,如下所示:http://.../Names/search/Αντ,它可以工作,它返回以Αντ开头的名称。但在应用程序中,它不工作。
是否可能是TEditTIdHTTP组件的编码错误?
就像它不读希腊字母,而是发送一个空字符串。
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;
i34xakig

i34xakig1#

URL不能包含 unencoded 非ASCII字符。您不能只按原样追加TEdit文本,您需要对任何非ASCII字符以及URI规范中保留的字符进行URL编码。
如果您使用浏览器的内置调试器,您将看到在向服务器传输请求时,它实际上正在进行这种编码。例如,一个URL如下:http://.../Names/search/Αντ发送如下请求:

GET /Names/search/%CE%91%CE%BD%CF%84 HTTP/1.1
Host: ...
...

注意Αντ =〉%CE%91%CE%BD%CF%84
在您的代码中,您可以使用Indy的TIdURI类来实现此目的,例如:

uses
  ..., IdURI;

mydata := IdHTTP1.GET('http://.../Names/search/'+TIdURI.PathEncode(Edit1.Text));

顺便说一句:
由于您发送的是GET请求,因此不需要设置Request.ContentTypeRequest.CharSetRequest.ContentEncoding属性(此外,'UTF-8'对于ContentEncoding也是无效的)。
另外,ParseJSONValue()有一个重载,它需要一个string,所以你不需要使用TEncoding.UTF8.GetBytes()

相关问题