Android 网络请求方法

在Android应用开发中,我们经常会与服务器交互,获取或上传数据,这就需要用到网络请求,一般情况下是使用HTTP协议去发送和接收网络数据,而HTTP又包括两种通信方式,即:HttpUrlConnection和HttpClient。

代码例子:https://git.oschina.net/ysx_xx/HttpText/tree/master

下面我简单地介绍这两种方式的使用:

首先,要进行网络请求,我们要先给应用添加网络权限,有两种方式添加:

1.    打开AndroidManifest.xml文件,选择permission,点击Add:

选择最后一个UsesPermission:

然后在右边Name选项找到android.permission.INTERNET,保存

然后再选择AndroidManifest.xml选项,就能看到

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

2.第二种方法其实就是直接在AndroidManifest中添加上面那句话,前提是你熟悉怎么写。

-------------------------------------------------------------------------------------------------------------------------------------------------------

好了,下面来讲讲那两种请求方式的使用

1.    HttpUrlConnection:

先new一个URL对象并传入网络地址,再调用openConnection()方法获取HttpUrlConnection实例,然后设置HTTP请求的方法(GET/POST),接着设置连接超时、读取超时、消息头等,这个可以根据实际情况编写,之后用getInputStream()方法获取从服务器返回的输入流,并读取内容,最后调用disconnect()方法关闭。

代码:

new Thread(new Runnable() {

			@Override
			public void run() {
				HttpURLConnection connection = null;
				try {
					URL url = new URL("http://www.baidu.com/");
					// 调用URL的openConnection()方法,得到HttpURLConnection的实例
					connection = (HttpURLConnection) url.openConnection();
					// 设置HTTP请求方法为GET,一般GET为从服务器获取数据,POST为提交数据给服务器
					connection.setRequestMethod("GET");
					// 设置连接超时的毫秒数
					connection.setConnectTimeout(8000);
					// 设置读取超时的毫秒数
					connection.setReadTimeout(8000);
					// 获取服务器返回的输入流
					InputStream in = connection.getInputStream();
					// 对获取到的输入流进行读取
					BufferedReader reader = new BufferedReader(
							new InputStreamReader(in));
					String response = "", line;
					while ((line = reader.readLine()) != null) {
						response += line;
					}
					//获取成功,发送成功信息
					Message message = new Message();
					message.what = SUCCESS;
					message.obj = response;
					mHandler.sendMessage(message);
				} catch (Exception e) {
					//发送失败信息
					Message message = new Message();
					message.what = FAILE;
					message.obj = "请求失败";
					mHandler.sendMessage(message);
					e.printStackTrace();
				} finally {
					if (connection != null) {
						//如果connection为null,则关闭它
						connection.disconnect();
					}
				}
			}

		}).start();

运行效果如下:

  

以上是介绍GET方式,那如果要向服务器提交数据呢?

我们可以把请求方式改为POST,并提交参数

例如:

connection.setRequestMethod(“POST”);
DataOutputStream out = new DataOutputStream(connection.getOutputStream());
out.writeBytes(“username=小熊&password=123456”);

2.     下面来看看HttpClient的用法:

HttpClient是一个接口,我们要先创建一个DefaultHttpClient的实例,再创建一个HttpGet对象并传入网络地址,然后调用HttpClient的execute()方法发送GET请求,最后调用HttpResponse的getStatusLine()的getStatusCode()方法获取服务器返回的状态码,如果为200则说明成功

代码:

new Thread(new Runnable() {

			@Override
			public void run() {
				try {
					//因为HttpClient是一个接口,所以用DefaultHttpClient()方法创建一个实例
					HttpClient httpClient = new DefaultHttpClient();
					//创建HttpGet对象并传入网络地址,并调用HttpClient的execute方法发送GET请求
					HttpGet httpGet = new HttpGet("http://www.baidu.com");
					HttpResponse httpResponse = httpClient.execute(httpGet);
					//先取出服务器返回的状态码,如果是200则说明请求响应成功,这里可以自行判断获得的状态码
					//是什么来判断是否成功或是什么失败
					if(httpResponse.getStatusLine().getStatusCode() == 200){
						//请求响应成功,调用getEntity()方法获取HttpEntity实例并转换成字符串
						HttpEntity entity = httpResponse.getEntity();
						String response = EntityUtils.toString(entity, "utf-8");

						//获取成功,发送成功信息
						Message message = new Message();
						message.what = SUCCESS;
						message.obj = response;
						mHandler.sendMessage(message);
					}
				} catch (Exception e) {
					//发送失败信息
					Message message = new Message();
					message.what = FAILE;
					message.obj = "请求失败";
					mHandler.sendMessage(message);
					e.printStackTrace();
				}
			}

		}).start();

运行效果跟HttpURLConnection一样,这里就不多发一遍了。下面是HttpClient的POST方式:

关键代码:

HttpPost httpPost = new HttpPost("http://www.baidu.com");
					List<NameValuePair> params = new ArrayList<NameValuePair>();
					params.add(new BasicNameValuePair("username", "小熊"));
					params.add(new BasicNameValuePair("password", "123456"));
					UrlEncodedFormEntity entity = new UrlEncodedFormEntity(params, "utf-8");
					httpPost.setEntity(entity);
					httpClient.execute(httpPost);

完整代码:

HttpURLConnectionText.java:

public class HttpURLConnectionText extends Activity implements OnClickListener {

	private final static int SUCCESS = 1;
	private final static int FAILE = 0;
	private TextView result;
	private Button send;
	private LoadingDialog loadingDialog;
	private Context mContext;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		initData();
	}

	private void initData() {
		mContext = this;
		result = (TextView) findViewById(R.id.result);
		send = (Button) findViewById(R.id.send);
		send.setOnClickListener(this);
	}

	private Handler mHandler = new Handler() {
		public void handleMessage(Message msg) {
			String response;
			if(loadingDialog != null && loadingDialog.isShowing()){
				loadingDialog.dismiss();
			}
			switch (msg.what) {
			case SUCCESS:
				response = msg.obj.toString();
				result.setText(response);
				break;
			case FAILE:
				response = msg.obj.toString();
				result.setText(response);
				break;
			}
		};
	};

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.send:
			loadingDialog = new LoadingDialog(mContext);
			loadingDialog.setCancel(false);
			loadingDialog.show();
			startSend();
			break;
		}
	}

	private void startSend() {
		new Thread(new Runnable() {

			@Override
			public void run() {
				HttpURLConnection connection = null;
				try {
					URL url = new URL("http://www.baidu.com/");
					// 调用URL的openConnection()方法,得到HttpURLConnection的实例
					connection = (HttpURLConnection) url.openConnection();
					// 设置HTTP请求方法为GET,一般GET为从服务器获取数据,POST为提交数据给服务器
					connection.setRequestMethod("GET");
					// 设置连接超时的毫秒数
					connection.setConnectTimeout(8000);
					// 设置读取超时的毫秒数
					connection.setReadTimeout(8000);
					// 获取服务器返回的输入流
					InputStream in = connection.getInputStream();
					// 对获取到的输入流进行读取
					BufferedReader reader = new BufferedReader(
							new InputStreamReader(in));
					String response = "", line;
					while ((line = reader.readLine()) != null) {
						response += line;
					}
					//获取成功,发送成功信息
					Message message = new Message();
					message.what = SUCCESS;
					message.obj = response;
					mHandler.sendMessage(message);
				} catch (Exception e) {
					//发送失败信息
					Message message = new Message();
					message.what = FAILE;
					message.obj = "请求失败";
					mHandler.sendMessage(message);
					e.printStackTrace();
				} finally {
					if (connection != null) {
						//如果connection为null,则关闭它
						connection.disconnect();
					}
				}
			}

		}).start();
	}

}

HttpClientText.java:

public class HttpClientText extends Activity implements OnClickListener {

	private final static int SUCCESS = 1;
	private final static int FAILE = 0;
	private TextView result;
	private Button send;
	private LoadingDialog loadingDialog;
	private Context mContext;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		initData();
	}

	private void initData() {
		mContext = this;
		result = (TextView) findViewById(R.id.result);
		send = (Button) findViewById(R.id.send);
		send.setOnClickListener(this);
	}

	private Handler mHandler = new Handler() {
		public void handleMessage(Message msg) {
			String response;
			if(loadingDialog != null && loadingDialog.isShowing()){
				loadingDialog.dismiss();
			}
			switch (msg.what) {
			case SUCCESS:
				response = msg.obj.toString();
				result.setText(response);
				break;
			case FAILE:
				response = msg.obj.toString();
				result.setText(response);
				break;
			}
		};
	};

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.send:
			loadingDialog = new LoadingDialog(mContext);
			loadingDialog.setCancel(false);
			loadingDialog.show();
			startSend();
			break;
		}
	}

	private void startSend() {
		new Thread(new Runnable() {

			@Override
			public void run() {
				try {
					//因为HttpClient是一个接口,所以用DefaultHttpClient()方法创建一个实例
					HttpClient httpClient = new DefaultHttpClient();
					//创建HttpGet对象并传入网络地址,并调用HttpClient的execute方法发送GET请求
					HttpGet httpGet = new HttpGet("http://www.baidu.com");
					HttpResponse httpResponse = httpClient.execute(httpGet);
					//先取出服务器返回的状态码,如果是200则说明请求响应成功,这里可以自行判断获得的状态码
					//是什么来判断是否成功或是什么失败
					if(httpResponse.getStatusLine().getStatusCode() == 200){
						//请求响应成功,调用getEntity()方法获取HttpEntity实例并转换成字符串
						HttpEntity entity = httpResponse.getEntity();
						String response = EntityUtils.toString(entity, "utf-8");

						//获取成功,发送成功信息
						Message message = new Message();
						message.what = SUCCESS;
						message.obj = response;
						mHandler.sendMessage(message);
					}
				} catch (Exception e) {
					//发送失败信息
					Message message = new Message();
					message.what = FAILE;
					message.obj = "请求失败";
					mHandler.sendMessage(message);
					e.printStackTrace();
				}
			}

		}).start();
	}

}

欢迎关注小熊公众号哦^_^同步更新...

微信号:smile_klxx

时间: 2024-11-04 16:18:24

Android 网络请求方法的相关文章

Android网络请求框架AsyncHttpClient实例详解(配合JSON解析调用接口)

最近做项目要求使用到网络,想来想去选择了AsyncHttpClient框架开进行APP开发.在这里把我工作期间遇到的问题以及对AsyncHttpClient的使用经验做出相应总结,希望能对您的学习有所帮助. 首先按照惯例先来简单了解一些AsyncHttpClient网络框架的一些知识. 1.简介 Android中网络请求一般使用Apache HTTP Client或者采用HttpURLConnect,但是直接使用这两个类库需要写大量的代码才能完成网络post和get请求,而使用android-a

Android 网络请求json数据,解析json数据,生成对应的java bean类一步到位,快速开发

Android 网络请求一般都涉及到图片和JSON数据,怎样快速的请求网络JSON数据,解析JSON数据,并且一步生成自己想要的Java bean实体类?这个涉及到Android 开发效率的问题.由于接触Android 网络这方面比较多,自然就找到一些好的方法来快速开发Android 网络模块的相关内容,接下来就为大家揭晓 一步快速请求,解析JSON 数据生成对应的Java bean实体类的方法. 注:我们先把思路讲解下吧: 1.网络请求JSON数据代码可以自己写,当然我还是推荐使用网络上开源的

iOS开发——网络请求方法汇总

在实际的项目开发中,连接网络是每一款App必不可少的基本功能.对于客户端的网络请求而言,无非是有两个实现方向:使用网络请求框架或者不使用网络请求框架.在这篇博客中,我将用苹果自带的网络请求方式(不使用第三方框架)下对iOS网络请求方法做一个汇总.我将在之后的博客中介绍使用AFNetworking框架进行请求的实现.代码已经上传至:https://github.com/chenyufeng1991/iOS-NetworkRequest   . [使用XML请求Webservice,可用GET或PO

【Java&amp;Android开源库代码剖析】のandroid-async-http(如何设计一个优雅的Android网络请求框架,同时支持同步和异步请求)开篇

在<[Java&Android开源库代码剖析]のandroid-smart-image-view>一文中我们提到了android-async-http这个开源库,本文正式开篇来详细介绍这个库的实现,同时结合源码探讨如何设计一个优雅的Android网络请求框架.做过一段时间Android开发的同学应该对这个库不陌生,因为它对Apache的HttpClient API的封装使得开发者可以简洁优雅的实现网络请求和响应,并且同时支持同步和异步请求. 网络请求框架一般至少需要具备如下几个组件:1

Android 网络请求及数据处理

Android 网络请求: 1.Volley   http://blog.csdn.net/t12x3456/article/details/9221611 2.Android-Async-Http   http://www.cnblogs.com/angeldevil/p/3729808.html Android Json 处理: 1.Gson 2.fast-json

浅论Android网络请求库——android-async-http

浅论Android网络请求库——android-async-http Android应用中使用AsyncHttpClient来异步网络数据

android网络请求库volley方法详解

使用volley进行网络请求:需先将volley包导入androidstudio中 File下的Project Structrue,点加号导包 volley网络请求步骤: 1. 创建请求队列       RequestQueue queue = Volley.newRequestQueue(this); 2.创建请求对象(3种) StringRequest request = new StringRequest(“请求方法”,“请求的网络地址”,“成功的网络回调”,“失败的网络回调”): Ima

Android网络请求

HTTP请求与响应 HTTP请求包结构 例: POST /meme.php/home/user/login HTTP/1.1 Host: 114.215.86.90 Cache-Control: no-cache Postman-Token: bd243d6b-da03-902f-0a2c-8e9377f6f6ed Content-Type: application/x-www-form-urlencoded tel=13637829200&password=123456 HTTP响应包结构 例

Android进阶笔记01:Android 网络请求库的比较及实战(一)

在实际开发中,有的时候需要频繁的网络请求,而网络请求的方式很多,最常见的也就那么几个.本篇文章对常见的网络请求库进行一个总结. 一.使用HttpUrlConnection: 1. HttpUrlConnection 最开始学android的时候用的网络请求是HttpUrlConnection,当时很多东西还不知道,但是在android2.2及以下版本中HttpUrlConnection存在着一些bug,所以建议在android2.3以后使用HttpUrlConnection,之前使用HttpCl