对于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");