如果我们试图用TIdHTTP执行GET,并以中文单词作为参数,我们需要什么特殊的处理方式?

问题描述 投票:0回答:1

我试图在Delphi中使用下面的URL进行GET。TIdHTTO 但却失败了。

https://api.sketchengine.eu/bonito/run.cgi/wsketch?lemma=上海&username=agofpos&api_key=ce39ab3f07544e759b068338ac1974e2&corpname=preloaded/zhtenten17_simplified_stf2&format=json

但使用POSTMAN是可以的

这是我的代码。

url := 'https://api.sketchengine.eu/bonito/run.cgi/wsketch?lemma=上海&username=agofpos&api_key=ce39ab3f07544e759b068338ac1974e2&corpname=preloaded/zhtenten17_simplified_stf2&format=json';
memoResult.Text := idHttp.Get(url);

当我们在GET过程中处理非英文字符时,是否需要特殊处理?如果需要,如何处理?

我使用的是Delphi 10.2,如果这有帮助的话。

indy delphi-10.2-tokyo
1个回答
1
投票

URL不允许使用非ASCII字符(IRI允许,但这些字符还没有被广泛使用)。 在URL中,你必须对任何非ASCII字符(和其他保留字符)进行url-encode,比如Indy的 TIdURI 类,例如

uses
  ..., IdURI;

url := 'https://api.sketchengine.eu/bonito/run.cgi/wsketch?lemma=' + TIdURI.ParamsEncode('上海') + '&username=agofpos&api_key=ce39ab3f07544e759b068338ac1974e2&corpname=preloaded/zhtenten17_simplified_stf2&format=json';
memoResult.Text := idHttp.Get(url);

这将会把汉字编码成UTF-8,然后把这些字节编码成中文。%HH 格式,例如

https:/api.sketchengine.eubonitorun.cgiwsketch?lemma=%E4%B8%8A%E6%B5%B7&username=agofpos&api_key=ce39ab3f07544e759b068338ac1974e2&corpname=preloadedzhtenten17_simplified_stf2&format=json。

请注意 上海 成为 %E4%B8%8A%E6%B5%B7.

Web浏览器、POSTMAN等都会在内部为你处理这个问题。 你可以通过查看实际传输的原始HTTP请求来确认这一点。

© www.soinside.com 2019 - 2024. All rights reserved.