Android Apache HTTP客户端

在这篇文章中,我想描述如何使用Apache库构建HTTP客户端 。 在我的一篇文章中,我描述了如何使用HttpUrlConnection创建客户端。 使用Apache库,我想解释一下如何发出POST请求下载图像上传多部分二进制数据 。 此外,我将描述如何交换cookie。 因此涵盖的主题是:

  • POST请求
  • 下载二进制数据
  • 上传二进制数据
  • 交换Cookie


Apache库是Android SDK附带的外部库,可简化发出HTTP请求的任务。

POST请求

我们已经知道POST和GET是我们可以用来与远程服务器交换数据的基本方法。例如,我将一些文本格式的数据发送到远程服务器(到目前为止)。 因此,第一步是创建一个DefaultHttpClient ,它使用包装器发送数据。

HttpClient client = new DefaultHttpClient();

一旦有了客户,就必须实例化一个处理POST请求的类:

HttpPost post = new HttpPost(url);

url是我们要调用的URL。 要发送数据,我们只需创建一个列表
NameValuePair一个简单的类,其中包含我们要发送的参数的名称和值。

List<NameValuePair> nvList = new ArrayList<NameValuePair>();
BasicNameValuePair bnvp = new BasicNameValuePair("name", name);
// We can add more
nvList.add(bnvp);

在这种情况下,在第2行,我们将参数的名称设置为name,然后如前所述bnvp添加到列表中。 现在,我们已经构建了列表并将其设置在我们的发帖请求中,以便可以发送它:

post.setEntity(new UrlEncodedFormEntity(nvList));

在这种情况下,我们使用Url编码对参数进行编码。 最后一步是通过我们的DefaultHttpClient实例执行请求。 结果,我们获得了一个HttpResponse ,可用于读取请求的结果:

HttpResponse resp = client.execute(post);

要读取响应,我们可以获取InputStream(第1行)并以这种方式使用它读取数据:

InputStream is  = resp.getEntity().getContent();            
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuilder str = new StringBuilder();
String line = null;
while((line = reader.readLine()) != null){
    str.append(line + "\n");
}
is.close();
buffer.append(str.toString());

最后,我们有一个字符串可用于更新UI。

我们必须记住,此操作可能很耗时,因此我们必须在AsyncTask中执行此请求。 有关更多信息,请阅读“ Android HTTP客户端:GET,POST,下载,上传,多部分请求 ”一文。这足以说明我们目前所做的所有工作都应在doInBackground方法内。 运行示例,我们有:

服务器端 android_http_apache_client_server

下载二进制数据

另一个常见的操作是从服务器下载二进制数据。 在这种情况下,我们要从服务器下载图像并将其显示在我们的UI中。

操作非常简单,因为在这种情况下,我们必须发出HTTP Post请求,传递图像名称(第7-10行)并读取二进制响应(第15-28行):

@Override
protected byte[] doInBackground(String... params) {
    String url = params[0];
    String name = params[1];

    HttpClient client = new DefaultHttpClient();
    HttpPost post = new HttpPost(url);
    List<NameValuePair> paramList = new ArrayList<NameValuePair>();
    paramList.add(new BasicNameValuePair("name", name));
    byte[] data = null;

    try {
        post.setEntity(new UrlEncodedFormEntity(paramList));
        HttpResponse resp = client.execute(post);
        InputStream is = resp.getEntity().getContent();
        int contentSize = (int) resp.getEntity().getContentLength();
        System.out.println("Content size ["+contentSize+"]");
        BufferedInputStream bis = new BufferedInputStream(is, 512);

        data = new byte[contentSize];
        int bytesRead = 0;
        int offset = 0;

        while (bytesRead != -1 && offset < contentSize) {
            bytesRead = bis.read(data, offset, contentSize - offset);
            offset += bytesRead;
        } 
    }
    catch(Throwable t) {
        // Handle error here
        t.printStackTrace();
    }

    return data;
}

在第17行,我们读取响应长度,以便我们可以创建具有相同大小的字节数组(请参见第21行),然后在第19行,我们创建缓冲的输入流以读取响应流。 然后,我们只需读取填充数据字节数组的响应即可。 结果,我们有:

上传二进制数据

这是最有趣的方面之一。 要处理此操作,我们需要添加一个外部库以简化任务。 这是相对于android native api使用apache http client的缺点。 另一方面,我们看到android native api无法处理多部分请求,因此我们必须从零开始。 使用此库,我们可以简化过程,但最终导致更大的apk。 该库是开源的,称为httpmime-xxx.jar 。 您可以在这里下载。 请记住将其添加到您的项目中,并且必须将其导出(请参阅Eclipse中的订购和导出)。 作为示例,我们创建一个包含一些文本数据和图像的多部分请求。 因此,我们总是开始创建DefaultHttpClient和HttpPost:

HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost(url);

现在我们必须创建称为Entity的帖子内容:

MultipartEntity multiPart = new MultipartEntity();

然后添加单个部分:两个是文本数据,一个是二进制数据(我们要上传的图像):

multiPart.addPart("param1", new StringBody(param1));
multiPart.addPart("param2", new StringBody(param2));
multiPart.addPart("file", new ByteArrayBody(baos.toByteArray(), "logo.png"));

注意,在第3行,我们使用ByteArrayBody创建了一个包含二进制数据的零件。 我们使用创建的数据填充帖子内容:

post.setEntity(multiPart);

然后我们只需将其发送(或发布)到服务器:

client.execute(post);

运行我们拥有的应用程序:

android_http_apache_client_upload 服务器端 android_http_apache_client_upload_server

交换Cookie

HTTP协议中一个有趣的方面是cookie管理 。 我们知道HTTP是无状态协议,因此使用Cookie,我们可以在HTTP请求中保留一些信息。 作为示例,我们可以假设发出两个HTTP请求:一个调用URL,服务器返回包含某些信息的cookie,另一个请求将cookie发送回服务器。

第一个请求非常简单:

HttpPost post = new HttpPost(url);
HttpResponse resp = client.execute(post);

然后,我们读取Cookie(第1,3行):

CookieStore store = ((DefaultHttpClient) client).getCookieStore();

List<Cookie> cookies = store.getCookies();
if (cookies != null) {
    for (Cookie c : cookies) { 
        System.out.println("Name ["+c.getName()+"] - Val ["+c.getValue()+"] 
                      - Domain ["+c.getDomain()+"] - Path ["+c.getPath()+"]");
        store.addCookie(c);
    }
}

在第1行,我们仅获得存储cookie的cookie存储。 在第3行,我们检索cookie列表。 在第二个发布请求中,我们必须维护在第一个请求中检索到的cookie,因此我们需要:

HttpContext ctx = new BasicHttpContext();
ctx.setAttribute(ClientContext.COOKIE_STORE, store);

// Post again with cookie 
HttpPost post1 = new HttpPost(url);
client.execute(post1);
HttpResponse resp1 = client.execute(post, ctx);

在第1行,我们创建BasicHttpContext来处理Cookie,在第2行,我们在上下文中设置存储,最后在第7行,我们也执行了传递上下文的请求。

我们必须注意的一件事是DefaultHttpClient始终相同,以便我们可以重复使用cookie

运行示例,我们有:

android_http_apache_client_cookie
android_http_apache_client_server_cookie
客户端Cookie输出 服务器端Cookie输出


源代码可从github获得

参考:来自我们的JCG合作伙伴 Francesco Azzola的Android Apache HTTP客户端 ,位于Surviving w / Android博客上。

翻译自: https://www.javacodegeeks.com/2013/06/android-apache-http-client.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android Studio是一个用于开发Android应用程序的集成开发环境(IDE)。它提供组件和工具,帮助开发者创建现代的 Android 应用程序和游戏。下面将会介绍如何在Android Studio上实现一个客户端。 首先,在Android Studio上创建一个新的Android项目。然后,在该项目中创建界面UI,可以使用Android studio自带的Layout Editor或直接手写XML布局文件实现。接下来,可以通过选择适当的控件添加所需的用户界面元素。例如,可以添加EditText文本框来允许用户输入数据,添加Button按钮来触发事件等。 然后,开发者需要实现客户端与服务器之间的通信。可以使用Android的网络API来实现这一点。例如,可以使用HttpURLConnection或Apache HttpComponents来创建HTTP连接,并与服务器进行通信。在与服务器通信时,需要考虑网络错误和异常的处理,以确保客户端的稳定性和可靠性。 最后,对于客户端的用户体验,开发者可以添加各种功能和特性,例如本地存储、数据加密、通知和提示等,使其尽可能的满足用户需求和要求。 综上所述,使用Android Studio实现一个客户端需要开发者熟悉Android的开发流程,了解与服务器通信方式,以及具有良好的UI设计能力和代码编写技巧。只有具备这些必备要素,开发者才能够实现一个高质量、安全可靠的客户端应用程序。 ### 回答2: Android Studio是一个由谷歌开发的集成开发环境,它的主要作用是帮助开发者快速创建Android应用程序。在Android Studio上实现客户端,一般需要经过以下几个步骤: 1. 安装和设置Android Studio 首先,需要下载和安装最新版本的Android Studio,并设置JDK和Android SDK路径。Android Studio需要Java开发工具包(JDK)的支持,因此需要先安装JDK。然后,需要安装Android SDK,包含多种编译版本的Android操作系统和相关的软件包。 2. 创建新的Android项目 在Android Studio中,可以创建新的Android项目,选择一种适当的模板,如Empty Activity、Basic Activity、Navigation Drawer Activity等。在创建新项目时,需要设置应用程序名称、包名称、最低支持的Android版本等相关参数。 3. 设计布局和UI界面 通过Android Studio提供的可视化布局编辑器或使用XML代码手动设计应用程序的UI界面。在设计布局和UI界面时,需要考虑视觉设计的美观性和用户体验的友好性。 4. 编写业务逻辑和代码 在Android Studio中,可以使用Java或Kotlin编写客户端的业务逻辑和代码。根据需求,可以使用各种API和框架来实现不同的功能,如网络请求、数据存储、多媒体处理等。 5. 调试和测试客户端Android Studio中,可以使用内置的调试器来检查应用程序的运行状态和调试代码中的错误。同时,可以使用模拟器或连接实际设备来测试和验证应用程序的功能和性能。 总之,在Android Studio上实现客户端需要开发者具备一定的编程能力和开发经验。通过熟悉Android Studio的基本操作和了解Android应用程序的设计和开发原理,可以快速上手开发高质量的Android客户端应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值