Android之使用HTTP协议访问网络

对于HTTP协议,大家肯定不陌生,我们平时访问网站的网址一般都是使用http协议的,它的工作原理十分简单,就是客户端向服务器发送一条HTTP请求,服务器收到请求之后会返回一些数据给客户端,然后客户端再对这些数据进行解析处理就可以了。可以总结为一下几步:

1、客户端发送HTTP请求

2、服务器接受服务响应

3、服务器返回数据

4、客户端解析处理返回数据

接下来通过手动发送HTTP请求的方式,来更加深入地理解一下这个过程。

HttpURLConnection的使用

由于在Android 5.0后HttpClient被废弃了,所以这里只介绍如何使用HttpURLConnection来访问网络,首先要获取HttpURLConnection的实例,代码如下:

try {
			URL url = new URL("http://www.baidu.com");
			HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

得到HttpURLConnection的实例之后,我们可以设置一下HTTP请求所使用的方法。常用的方法主要有两个,GET和POST。GET表示希望从服务器里获取数据,而POST则表示希望提交数据给服务器。我们这里就设置为GET,代码如下:

connection.setRequestMethod("GET");
接下来就可以进行一些自由的定制了,比如设置连接超时、读取超时的毫秒数,以及服务器希望得到一些消息头,代码如下:

connection.setConnectTimeout(8000);
connection.setReadTimeout(8000);
然后再调用getInputStream()方法就可以获取到服务器返回的数据输入流,然后就可以对数据流进行读取,代码如下:

InputStream in = connection.getInputStream();
最后可以调用disconnect()方法将这个HTTP连接关闭掉,代码如下:

connection.disconnect();
下面就以访问百度网站为例,代码如下:

public class MainActivity extends Activity {
	
	private final static int SHOW_RESPONSE = 1;
//	private HttpsURLConnection connection;
	private TextView tv_Response;
	final Handler myHandler = new Handler(){
		public void handleMessage(Message msg) {
			switch (msg.what) {
			case SHOW_RESPONSE:
				tv_Response.setText(msg.obj.toString());
				break;

			default:
				break;
			}
		};
	};
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		Button btnSendRequest = (Button) findViewById(R.id.send_request);
		tv_Response = (TextView)findViewById(R.id.response_text);
		btnSendRequest.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				sendHttpRequest("http://www.baidu.com");
			}
		});
	}
	public void sendHttpRequest(final String url){
		new Thread(new Runnable() {
			final String urlString = url;
			@Override
			public void run() {
				// TODO Auto-generated method stub
				HttpURLConnection connection = null;
				try {
					URL url = new URL(urlString);
					connection = (HttpURLConnection) url.openConnection();
					connection.setRequestMethod("GET");
					connection.setConnectTimeout(8000);
					connection.setReadTimeout(8000);
					InputStream in = connection.getInputStream();
					BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in));
					StringBuilder response = new StringBuilder();
					String line;
					while((line = bufferedReader.readLine()) != null){
						response.append(line);	
					}
					Message message = new Message();
					message.what = SHOW_RESPONSE;
					message.obj = response.toString();
					myHandler.sendMessage(message);
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}finally{
					if(connection != null){
						connection.disconnect();
					}
				}
			}
		}).start();
	}
	
}
最后还要在AndroidManifest.xml中声明一下网络权限:

<uses-permission android:name="android.permission.INTERNET"/>
如果想要向服务器提交数据,则只需将HTTP请求的方法改成POST,并在输入流前把数据提交,注意,数据每条数据都要以键值对的形式存在,数据与数据之间用&符号隔开,比如提交用户名和密码,就可以这样写:

connection.setRequestMethod("POST");
DataOutputStream out = new DataOutputStream(connection.getOutputStream());
out.writeBytes("username=admin&password=123456");








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章