Android之使用HTTP协议访问网络

来源:互联网 发布:移动网络玩电信游戏 编辑:程序博客网 时间:2024/06/08 00:48

对于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 blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.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;}};};@Overrideprotected 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() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubsendHttpRequest("http://www.baidu.com");}});}public void sendHttpRequest(final String url){new Thread(new Runnable() {final String urlString = url;@Overridepublic void run() {// TODO Auto-generated method stubHttpURLConnection 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 blocke.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");








0 0