Android 中 HttpGet 的 URL 中的"Illegal Characters"获得双重编码



我现在整个晚上都在试图找到解决这个问题的方法......

我编写了一个从Web服务器请求数据的应用程序。服务器以 JSON 格式应答。一切都运行良好,除了当我在我的应用程序中输入像 ä 这样的变音符号时。

在下文中,我假设请求 URL 为 http://example.com/?q=,并且我正在搜索"Jäger"

正确的调用是h++p://example.com/?q=J%C3%A4ger(很抱歉加号,但垃圾邮件保护不允许我正确发布它。

所以我的问题是现在:

当我将编码或未编码的URL字符串提供给HttpGet时,它将始终产生双编码的URL。

然后 http://example.com/?q=J%25C3%25A4ger 对我的服务器的请求(它对百分号进行编码)这导致服务器在数据库中搜索 J%C3%A4ger 显然是错误的。

所以我的问题是,如果用户输入"Jäger",我如何才能实现我的应用程序调用正确编码的 URL?

感谢您的任何帮助!

这是当前使用的代码...这可能是我最糟糕的想法...

URI url = new URI("http", "//example.com/?q=" + ((EditText)findViewById(R.id.input)).getText().toString(), null);
Log.v("MyLogTag", "API Request: " +  url);
HttpGet httpGetRequest = new HttpGet(url);
// Execute the request in the client
HttpResponse httpResponse;
httpResponse = defaultClient.execute(httpGetRequest);

更新:抱歉,HttpParams不是用于请求参数,而是用于配置HttpClient

在Android上,您可能希望使用Uri.Builder,就像其他SO答案中建议的那样:

Uri uri = new Uri.Builder()
    .scheme("http")
    .authority("example.com")
    .path("someservlet")
    .appendQueryParameter("param1", foo)
    .appendQueryParameter("param2", bar)
    .build();
HttpGet request = new HttpGet(uri.toString());
// This looks very tempting but does NOT set request parameters
// but just HttpClient configuration parameters:
// HttpParams params = new BasicHttpParams();
// params.setParameter("q", query);
// request.setParams(params);
HttpResponse response = defaultClient.execute(request);
String json = EntityUtils.toString(response.getEntity());

在Android之外,最好的选择是手动构建查询字符串(带有所有编码麻烦)或查找类似于Android Uri.Builder的东西。


最新更新