我正试图在整个晚上找到解决方案......
我编写了一个从Web服务器请求数据的应用程序。服务器以JSON格式回答。 一切都运作良好,除非我在我的应用程序中输入像ä这样的变音符号。
在下面我假设请求网址为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);
答案 0 :(得分:1)
更新:抱歉,HttpParams
不适用于请求参数,而是适用于配置 HttpClient
。
在Android上,您可能希望使用Uri.Builder
,如this other SO answer中建议的那样:
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
类似的内容。