Android 对 MongoLab 的 HTTP GET 请求

Android HTTP GET request to MongoLab

我正在 MongoLab 的沙盒数据库中开发测试应用程序。 执行 REST 查询时,我得到了正确的文档,但在我的 Android 应用程序中执行相同的内容会抛出异常:

查询: https://api.mongolab.com/api/1/databases/my-db/collections/my-col?q={id:"123"}&apiKey=*** (当然定义了 db,col 和 api 键)。 将此 URI 放入浏览器中会返回我要查找的文档。

Android:

class RequestTask extends AsyncTask<String, String, String> {

    @Override
    protected String doInBackground(String... uri) {
        Log.i("URI", uri[0]);
        HttpClient httpclient = new DefaultHttpClient();
        HttpResponse response;
        String responseString = null;
        try {
            response = httpclient.execute(new HttpGet(uri[0]));
            StatusLine statusLine = response.getStatusLine();
            if (statusLine.getStatusCode() == HttpStatus.SC_OK) {
                ByteArrayOutputStream out = new ByteArrayOutputStream();
                response.getEntity().writeTo(out);
                responseString = out.toString();
                out.close();
            } else {
                // Closes the connection.
                response.getEntity().getContent().close();
                throw new IOException(statusLine.getReasonPhrase());
            }
        } catch (ClientProtocolException e) {
            Log.e(LOG_TAG, e.getMessage());
        } catch (IOException e) {
            Log.e(LOG_TAG, e.getMessage());
        }
        return responseString;
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        Log.i(LOG_TAG, result);
    }
}

异常:

java.lang.RuntimeException: An error occured while executing doInBackground()
...
Caused by: java.lang.IllegalArgumentException: Illegal character in query at index 71: https://api.mongolab.com/api/1/databases/my-db/collections/my-col?q={"id":"123"}&apiKey=***

索引 71 处的字符是 my-col?q 之后的第一个 =,并且有对这一行的引用: response = httpclient.execute(new HttpGet(uri[0]));

为什么它在浏览器上运行良好,但在我的设备上运行不佳? 不过,我已经成功地提取了所有文档而无需查询...

如果您将 URL 直接传递给客户端,它不会自动编码。

尝试使用 URLEncoder.encode(yourParameter, "UTF-8") 对其进行编码或使用查询生成器和 android.net.Uri.Builder 中的 appendQueryParameter 方法。