理解Android的Http协议

来源:互联网 发布:影像测量仪软件 编辑:程序博客网 时间:2024/06/05 15:32

  HTTP是超文本传送协议(hypertext transport protocol),用于传送WWW方式的数据,属于应用层的面向对象的协议。HTTP采用了请求/响应的模型,HTTP定义了与服务器交互的不同方式,最基本的4种分别是GET、POST、PUT、DELETE,URL则全称为资源描述符,我们可以认为一个URL地址描述了一个网络上的资源,而HTTP中的GET、POST、PUT、DELETE分别对应这个资源的查、改、增、删4个操作。GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。


HTTP请求服务器的流程大概分4步:

1、生成一个请求对象。

2、客户端向服务器发送一个请求。

3、服务器响应客户端请求。

4、断开连接。


使用HTTP的GET向百度服务器请求获取信息

实现的效果是点击Button,向百度服务器请求数据,获取信息。

package com.tang.Javen;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.client.ClientProtocolException;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpGet;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.impl.conn.DefaultClientConnection;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class MainActivity extends Activity {private Button button = null;private HttpResponse httpResponse = null;private HttpEntity httpEntity = null;    /** Called when the activity is first created. */    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);                button = (Button)findViewById(R.id.button);        button.setOnClickListener(new OnClickListener(){public void onClick(View v){//生成一个请求对象HttpGet httpGet = new HttpGet("http://www.baidu.com");//生成一个客户端对象HttpClient httpClient = new DefaultHttpClient();InputStream inputStream = null;try{//向服务端发送一次请求,并且服务器端会返回一个httpResponsehttpResponse = httpClient.execute(httpGet);//想要获取这个服务器返回的数据,则可以使用HttpEntityhttpEntity = httpResponse.getEntity();//获取这个httpEntity的输入输出流inputStream = httpEntity.getContent();//接下来就是IO流的操作了BufferedReader reader = new BufferedReader( new InputStreamReader(inputStream));String result = "";String line = "";while((line = reader.readLine()) != null){result = result + line;}System.out.println(result);} catch (Exception e){// TODO Auto-generated catch blocke.printStackTrace();}}});    }}

这里可以看到获取网络服务器的信息步骤:

1、生成一个请求的对象,并且把百度的URL地址作为参数传递进去。

HttpGet httpGet = new HttpGet("http://www.baidu.com");

2、生成一个客户端对象。

HttpClient httpClient = new DefaultHttpClient();


3、客户端向服务器发送一个请求,并且获取到服务器返回的HttpResponse。

httpResponse = httpClient.execute(httpGet);

4、如果想获取到HttpResponse中的数据,则需要使用到HttpEntity,并且获取InputStream。

httpEntity = httpResponse.getEntity();//获取这个httpEntity的输入输出流inputStream = httpEntity.getContent();

5、接着从这个inputStream中读取数据。

BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));String result = "";String line = "";while((line = reader.readLine()) != null){result = result + line;}System.out.println(result);


点击Button后,获取的打印信息如下:

当需要使用GET方法发送请求时需要带参数时,则需要在URL后面加上(?**=**&**=**);比如我想把name="zhangsan", age="20"发送到服务器中去,则URL应该写成http://www.baidu.com?name=zhangsan&age=20


使用HTTP的POST向百度服务器请求获取信息


POST请求的方法跟GET差不多,只不过在传递参数时有所不同。
postButton = (Button)findViewById(R.id.post);        postButton.setOnClickListener(new OnClickListener(){public void onClick(View v){HttpPost requestPost = new HttpPost("http://www.baidu.com");NameValuePair pair1 = new BasicNameValuePair("name", "zhangsan");NameValuePair pair2 = new BasicNameValuePair("age", "20");List<NameValuePair> pairs = new ArrayList<NameValuePair>();pairs.add(pair1);pairs.add(pair2);try{UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(pairs);requestPost.setEntity(formEntity);HttpClient httpClient = new DefaultHttpClient();InputStream inputStream = null;try{//向服务端发送一次请求,并且服务器端会返回一个httpResponsehttpResponse = httpClient.execute(requestPost);//想要获取这个服务器返回的数据,则可以使用HttpEntityhttpEntity = httpResponse.getEntity();//获取这个httpEntity的输入输出流inputStream = httpEntity.getContent();//接下来就是IO流的操作了BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));String result = "";String line = "";while((line = reader.readLine()) != null){result = result + line;}System.out.println(result);} catch (Exception e){// TODO Auto-generated catch blocke.printStackTrace();}} catch (UnsupportedEncodingException e){// TODO Auto-generated catch blocke.printStackTrace();}}});

POST需要传递的参数需要用NameValuePair来传递,NameValuePair用一对键值对来表示一个查询参数,将多个NameValuePair放到一个List中就形成了一组查询参数,但是List<NameValuePair>并不能直接使用,需要用UrlEncodedFormEntity编码之后才能使用。通过requestPost.setEntity(formEntity)就将这些查询参数传递到post请求中去了。

0 0