【问题标题】:How to switch from HttpClient to HttpUrlConnection?如何从 HttpClient 切换到 HttpUrlConnection?
【发布时间】:2015-01-09 23:53:30
【问题描述】:

我正在创建一个 Android 应用程序,并通过 HttpClient 将数据从 Android 应用程序发送到 servlet。我使用 HttpPost 方法。

我在 Android 开发者网站上读到 Apache HttpClient 库在 Android Froyo 2.2 中有一些错误,毕竟使用 HttpUrlConnection 代替 HttpPost 是一种很好的做法。所以我想将我的 HttpPost 代码转换为 HttpUrlConnectio 但不知道如何。

我在这里发布我的 Android 代码以及 servlet 代码

安卓代码

private String postData(String valueIWantToSend[]) 
    {
        // Create a new HttpClient and Post Header
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost(url);
        try 
        {
            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
            nameValuePairs.add(new BasicNameValuePair("param1",valueIWantToSend[0]));
            nameValuePairs.add(new BasicNameValuePair("param2", valueIWantToSend[1]));
            nameValuePairs.add(new BasicNameValuePair("param3", valueIWantToSend[2]));
            nameValuePairs.add(new BasicNameValuePair("param4", valueIWantToSend[3]));
            nameValuePairs.add(new BasicNameValuePair("param5", valueIWantToSend[4]));
            nameValuePairs.add(new BasicNameValuePair("param6", valueIWantToSend[5]));
            nameValuePairs.add(new BasicNameValuePair("param7", valueIWantToSend[6]));
            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
            /* execute */
            HttpResponse response = httpclient.execute(httppost);
            HttpEntity rp = response.getEntity();

            //origresponseText=readContent(response);
        }
        catch (ClientProtocolException e) 
        {
            // TODO Auto-generated catch block
        } 
        catch (IOException e) 
        {
            // TODO Auto-generated catch block
        }
        return null;
    }

这是我的 servlet 代码

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
    response.setContentType("text/html");
    ObjectOutputStream out = new ObjectOutputStream(response.getOutputStream());
    Enumeration paramNames = request.getParameterNames();
    String params[] = new String[7];
    int i=0;

    while(paramNames.hasMoreElements())
    {
        String paramName = (String) paramNames.nextElement();
        System.out.println(paramName);


        String[] paramValues = request.getParameterValues(paramName);
        params[i] = paramValues[0];

        System.out.println(params[i]);

        i++;
    }

}

【问题讨论】:

  • 使用 HttpUrlConnection 的好习惯 不,远离。但看起来你正在使用一个过时的库。 Apache Http 组件现在是 4.3。您似乎仍在使用 2.x。
  • 所以HttpClient没有问题?
  • 可能与您正在使用的库有关。我不知道。但是HttpUrlConnection 不是一个好的 http 客户端。
  • 远离。请你解释一下

标签: java android servlets httpurlconnection apache-httpclient-4.x


【解决方案1】:

当我阅读already mentioned Google post 关于在较新版本的 Android 中执行 HTTP 请求的最佳实践时,我以为有人在开玩笑。 HttpURLConnection 使用起来真的是一场噩梦,与几乎任何其他与 HTTP 服务器通信的方式相比(除了直接的 Socket 通信)。

我没有找到一个真正精简的 Android 库来完成繁重的工作,所以我自己编写了一个。您可以在 DavidWebb 找到它,包括我在开发库后(不幸地)找到的 a list of alternative libraries

您的代码或多或少看起来像这样:

public void testPostToUrl() throws Exception {
    String[] values = new String[3];

    Webb webb = Webb.create();
    Response<String> response = webb
            .post("http://www.example.com/abc.php")
            .param("param1", values[0])
            .param("param2", values[1])
            .param("param3", values[2])
            .asString();

    assertEquals(200, response.getStatusCode());
    assertNotNull(response.getBody());
    assertTrue(response.getBody().contains("my expected result"));
}

public void testPostToUrlShorter() throws Exception {
    String[] values = new String[3];

    Webb webb = Webb.create();
    String result = webb
            .post("http://www.example.com/abc.php")
            .param("param1", values[0])
            .param("param2", values[1])
            .param("param3", values[2])
            .ensureSuccess()
            .asString()
            .getBody();

    assertTrue(result.contains("my expected result"));
}

【讨论】:

    【解决方案2】:

    你绝对应该使用HttpUrlConnection:

    对于 Gingerbread 和更好的,HttpURLConnection 是最佳选择...新应用程序应该使用 HttpURLConnection...

    --Google (circa. 2011)

    但是,“切换”没有简单的方法。 API 完全不同。你将不得不重写你的网络代码。关于如何提交 GET 和 POST 请求以及 SDK 示例应用程序中有完美的示例 in the documentation

    【讨论】:

    • 我已经看到了,但我不知道如何在使用 HttpUrlConnection 时在 post 方法中添加参数
    • 对于它的价值,我有很多卡车与谷歌发表的声明有关。 HttpUrlConnection 很棒,但是在构造带有参数等的 URL 时涉及到很多机制。HttpClient 是专门为允许更精细地控制 HTTP 连接的使用方式而构建的。我认为 Google 正试图摆脱他们捆绑的库并且没有干净的升级路径。
    【解决方案3】:

    您不必切换,您可以继续使用我在this 回答中描述的 apache 库。继续使用 apache 的库确实没有缺点 - 这只是 google 的营销。

    【讨论】:

    • 你确定 HttpClient 没有缺点吗?我的意思是,即使在牛轧糖中??
    • @IgorGanapolsky 是的,多年来没有注意到任何缺点。检查答案中的链接以获取一些详细信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-14
    • 1970-01-01
    • 2018-11-03
    • 1970-01-01
    • 2016-12-17
    • 1970-01-01
    • 2023-04-01
    相关资源
    最近更新 更多