Android网络编程之使用HttpClient进行Get方式通信

在Android开发中,Android SDK附带了Apache的HttpClient,它是一个完善的客户端。它提供了对HTTP协议的全面支持,可以使用HttpClient的对象来执行HTTP GET和HTTP POST调用。

HTTP工作原理:

1.客户端(一般是指浏览器,这里是指自己写的程序)与服务器建立连接

2.建立连接后,客户端向服务器发送请求

3.服务器接收到请求后,向客户端发送响应信息

4.客户端与服务器断开连接

HttpClient的一般使用步骤:

1.使用DefaultHttpClient类实例化HttpClient对象

2.创建HttpGet或HttpPost对象,将要请求的URL通过构造方法传入HttpGet或HttpPost对象。

3.调用execute方法发送HTTP GET或HTTP POST请求,并返回HttpResponse对象。

4.通过HttpResponse接口的getEntity方法返回响应信息,并进行相应的处理。

最后记得要在AndroidManifest.xml文件添加网络权限

<uses-permission android:name="android.permission.INTERNET" />

下面以聚合数据空气质量城市空气PM2.5指数数据接口为例来演示使用HttpClient进行Get方式通信,通过HttpClient建立网络连接,使用HttpGet方法读取数据,并且通过HttpResponse获取Entity返回值。

聚合数据空气质量城市空气PM2.5指数数据接口API文档参见:http://www.juhe.cn/docs/api/id/33/aid/79

请求示例:http://web.juhe.cn:8080/environment/air/pm?city=城市名称&key=你申请的APPKEY值

实例:HttpClientGetDemo

运行效果:

代码清单:

布局文件:activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

		<TextView
		    android:layout_width="wrap_content"
		    android:layout_height="wrap_content"
		    android:layout_weight="1"
		    android:gravity="center"
		    android:text="城市:"
		    android:textSize="23sp" />

		<EditText
            android:id="@+id/city"
            android:layout_width="wrap_content"
			android:layout_height="wrap_content"
			android:layout_weight="3"
            android:inputType="text" />"
    </LinearLayout>

    <Button
        android:id="@+id/query"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="查询"
        android:textSize="23sp" />

    <TextView
		android:id="@+id/result"
		android:layout_width="match_parent"
		android:layout_height="match_parent" />
</LinearLayout>

Java源代码文件:MainActivity.java

package com.rainsong.httpclientgetdemo;

import java.io.IOException;
import java.net.URLEncoder;
import java.util.ArrayList;

import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;

import android.os.Bundle;
import android.os.StrictMode;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {
    private static final String JUHE_URL_ENVIRONMENT_AIR_PM =
                                    "http://web.juhe.cn:8080/environment/air/pm";
    private static final String JUHE_APPKEY = "你申请的APPKEY值";
    EditText et_city;
    Button btn_query;
    TextView tv_result;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 强制直接在UI线程中进行网络操作
        StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
            .detectDiskReads().detectDiskWrites().detectNetwork()
            .penaltyLog().build());
        StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
            .detectLeakedSqlLiteObjects().detectLeakedClosableObjects()
            .penaltyLog().penaltyDeath().build());

        setContentView(R.layout.activity_main);
        et_city = (EditText)findViewById(R.id.city);
        tv_result = (TextView)findViewById(R.id.result);
        btn_query = (Button)findViewById(R.id.query);
        btn_query.setOnClickListener(new OnClickListener() {
            public void onClick(View view) {
                tv_result.setText("");
                String city;
                city = et_city.getText().toString();
                if (city.length() < 1) {
                    Toast.makeText(MainActivity.this, "请输入城市名",
                            Toast.LENGTH_LONG).show();
                    return;
                }
                ArrayList<NameValuePair> headerList = new ArrayList<NameValuePair>();
                headerList.add(new BasicNameValuePair("Content-Type",
                        "text/html; charset=utf-8"));
                String targetUrl = JUHE_URL_ENVIRONMENT_AIR_PM;
                ArrayList<NameValuePair> paramList = new ArrayList<NameValuePair>();
                paramList.add(new BasicNameValuePair("key", JUHE_APPKEY));
                paramList.add(new BasicNameValuePair("dtype", "json"));
                paramList.add(new BasicNameValuePair("city", city));

                for (int i = 0; i < paramList.size(); i++) {
                    NameValuePair nowPair = paramList.get(i);
                    String value = nowPair.getValue();
                    try {
                        value = URLEncoder.encode(value, "UTF-8");
                    } catch (Exception e) {

                    }
                    if (i == 0) {
                        targetUrl += ("?" + nowPair.getName() + "=" + value);
                    } else {
                        targetUrl += ("&" + nowPair.getName() + "=" + value);
                    }
                }

                HttpGet httpRequest = new HttpGet(targetUrl);
                try {
                    for (int i = 0; i < headerList.size(); i++) {
                        httpRequest.addHeader(headerList.get(i).getName(),
                                                headerList.get(i).getValue());
                    }

                    HttpClient httpClient = new DefaultHttpClient();

                    HttpResponse httpResponse = httpClient.execute(httpRequest);
                    if (httpResponse.getStatusLine().getStatusCode() == 200) {
                        String strResult = EntityUtils.toString(httpResponse.getEntity());
                        tv_result.setText(strResult);
                    } else {
                        Toast.makeText(MainActivity.this, "查询失败",
                                Toast.LENGTH_LONG).show();
                        tv_result.setText("");
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

注:本来不应该直接在UI线程进行网络操作,会阻塞UI,影响用户体验。但为了不引入其他知识点,把焦点聚集在HttpClient网络通信上,在本例中强制直接在UI线程中进行网络操作。在下篇文章中会介绍如何避免直接在UI线程中进行网络操作。

API知识点

public interface

HttpClient

org.apache.http.client.HttpClient

Known Indirect Subclasses

AbstractHttpClient, AndroidHttpClient, DefaultHttpClient

Class Overview

Interface for an HTTP client. HTTP clients encapsulate a smorgasbord of objects required to execute HTTP requests while handling cookies, authentication, connection management, and other features. Thread safety of HTTP clients depends on the implementation
and configuration of the specific client.

abstract HttpResponse execute(HttpUriRequest request)

Executes a request using the default context.

public class

DefaultHttpClient

extends AbstractHttpClient

org.apache.http.impl.client.DefaultHttpClient

Class Overview

Default implementation of an HTTP client.

Public Constructor

DefaultHttpClient()

Creates a new HTTP client.

public class

HttpGet

extends HttpRequestBase

Inherited Methods

From class org.apache.http.client.methods.HttpRequestBase

From class org.apache.http.message.AbstractHttpMessage

From class java.lang.Object

From interface org.apache.http.HttpMessage

From interface org.apache.http.HttpRequest

From interface org.apache.http.client.methods.AbortableHttpRequest

From interface org.apache.http.client.methods.HttpUriRequest

Public Constructors

HttpGet()

HttpGet(URI uri)

HttpGet(String uri)

abstract void addHeader(String name, String value)

Adds a header to this message.

public interface

HttpResponse

implements HttpMessage

org.apache.http.HttpResponse

Class Overview

An HTTP response.

abstract HttpEntity getEntity()

Obtains the message entity of this response, if any.

abstract StatusLine getStatusLine()

Obtains the status line of this response.

public interface

NameValuePair

org.apache.http.NameValuePair

Known Indirect Subclasses

BasicNameValuePair

Class Overview

A simple class encapsulating an attribute/value pair.

Public Methods

abstract String getName()

abstract String getValue()

public class

BasicNameValuePair

extends Object

implements Cloneable NameValuePair

org.apache.http.message.BasicNameValuePair

Public Constructors

BasicNameValuePair(String name, String value)

Default Constructor taking a name and a value.

时间: 2024-10-03 22:42:08

Android网络编程之使用HttpClient进行Get方式通信的相关文章

Android网络编程之使用HttpClient批量上传文件

请尊重他人的劳动成果,转载请注明出处:Android网络编程之使用HttpClient批量上传文件 我曾在<Android网络编程之使用HTTP访问网络资源>一文中介绍过HttpCient的使用,这里就不在累述了,感兴趣的朋友可以去看一下.在这里主要介绍如何通过HttpClient实现文件上传. 1.预备知识: 在HttpCient4.3之前上传文件主要使用MultipartEntity这个类,但现在这个类已经不在推荐使用了.随之替代它的类是MultipartEntityBuilder. 下面

Android网络编程之使用HttpClient批量上传文件(二)AsyncTask+HttpClient并实现上传进度监听

请尊重他人的劳动成果,转载请注明出处: Android网络编程之使用HttpClient批量上传文件(二)AsyncTask+HttpClient并实现上传进度监听 运行效果图: 我曾在<Android网络编程之使用HttpClient批量上传文件>一文中介绍过如何通过HttpClient实现多文件上传和服务器的接收.在上一篇主要使用Handler+HttpClient的方式实现文件上传.这一篇将介绍使用AsyncTask+HttpClient实现文件上传并监听上传进度. 监控进度实现: 首先

转 Android网络编程之使用HttpClient批量上传文件 MultipartEntityBuilder

请尊重他人的劳动成果,转载请注明出处:Android网络编程之使用HttpClient批量上传文件 http://www.tuicool.com/articles/Y7reYb 我曾在<Android网络编程之使用HTTP访问网络资源>一文中介绍过HttpCient的使用,这里就不在累述了,感兴趣的朋友可以去看一下.在这里主要介绍如何通过HttpClient实现文件上传. 1.预备知识: 在HttpCient4.3之前上传文件主要使用MultipartEntity这个类,但现在这个类已经不在推

Android网络编程之使用HttpClient和MultipartEntityBuilder 批量同时上传文件和文字

/** by keinta in China sz  email: [email protected]  2016.10.18 CN: 此JAR包里面已经集成了android http 网络请求包,也封装了 MultipartEntityBuilder 文件与文字同时上传,实现向下兼容   你只需要添加这两个包就可以实现android 的多类型网络传输了    Please add the  packages :      compile files('libs/org.apache.http.

Android网络编程(二)HttpClient与HttpURLConnection

相关文章 Android网络编程(一)HTTP协议原理 前言 上一篇我们了解了HTTP协议原理,这一篇我们来讲讲Apache的HttpClient和Java的HttpURLConnection,这两种都是我们平常请求网络会用到的.无论我们是自己封装的网络请求类还是第三方的网络请求框架都离不开这两个类库. 1.HttpClient Android SDK中包含了HttpClient,在Android6.0版本直接删除了HttpClient类库,如果仍想使用则解决方法是: 如果使用的是eclipse

Android 网络编程之---HttpClient 与 HttpURLConnection 共用cookie

前言 在编程过程中总结归纳出来的一种编程经验,从而形成的设计思想称为设计模式. 设计模式有23种.它适用于所有的编程语言. 常用的有创新型的设计模式:简单工厂.抽象工厂和单例模式:行为型的设计模式:模板设计模式.观察者模式和命令模式:结构性的设计模式:适配器设计模式.代理模式(静态和动态两种,典型的有在spring的AOP编程中使用)和装饰器设计模式. 正文 单例模式(singleton) 保证一个类在内存中只能创建一个实例. 1.实现步骤: 1)将构造器私有化,即使用private修饰构造器

Android网络编程网上文章总结

关于网络编程,网上也有许多好的文章,这里我就选了几篇觉得不错的归纳到了一起,仅供参考 Android网络编程概述 首先,应该了解的几个问题: 1)Android平台网络相关API接口 a) java.net.*(标准Java接口) java.net.*提供与联网有关的类,包括流.数据包套接字(socket).Internet协议.常见Http处理等.比如:创建URL,以及URLConnection/HttpURLConnection对象.设置链接参数.链接到服务器.向服务器写数据.从服务器读取数

Android网络编程系列 一 TCP/IP协议族

在学习和使用Android网路编程时,我们接触的仅仅是上层协议和接口如Apache的httpclient或者Android自带的httpURlconnection等等.对于这些接口的底层实现我们也有必要进一步的了解,这就要我们了解网络通信层了,提到网络通信层不得不说起ISO-OSI的七层协议经典架构,如图所示: 上图的左边部分就是osi架构模型了, ISO/OSI模型,即开放式通信系统互联参考模型(Open System Interconnection Reference Model),是国际标

漫谈Android网络编程

Android从业者,十之八九都是在做网络应用,不是互联网也是局域网.如今在4G和Wifi的天下下,流量什么的都已是浮云,单机应用的市场已然悄悄的一去不复返了.所以呢,不了解网络请求的同学要小心了,当心被时代的大浪一个浪头排在沙滩上. Android实现网络编程有HTTP.也有Socket.HTTP协议是应用层协议,主要解决如何包装数据,网络应用都会用到的协议:Socket是TCP/IP协议的封装,主要解决数据如何在网络中传输,常用于与服务器保持长连接,一般用于广告推送.实时聊天.在线游戏等.