【问题标题】:"Illegal Characters" in URL for HttpGet in Android get double-encodedAndroid 中 HttpGet 的 URL 中的“非法字符”被双重编码
【发布时间】:2012-04-30 10:47:13
【问题描述】:

我整个晚上都在努力寻找解决方案……

我编写了一个从 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);

【问题讨论】:

  • @Philipp-Reichard 你在这里

标签: java android url httpclient http-get


【解决方案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 的内容。


【讨论】:

  • 我明天试试这个。这里是凌晨 1 点,我要在大约 6 小时后上班
  • 这里也一样,我明天也回来看看:)
  • 糟糕,我把 HttpParams 误认为不是 - 请查看我的更新答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多