12.2 HTTP请求

    如果不通过HTTP访问,那么Web服务不会是一个”Web“服务。在Android上生成一个HTTP请求非常的简单,可以使用Apache提供的HttpClient类,他们包含在Android的org.apache.http程序包中。

     首先需要创建HttpClient对象,它实际上是一个DefaultHttpClient对象。

1         HttpClient httpclient=new DefaultHttpClient();

    随后就可以构造请求。在当前情况下会生成一个GTTP GET请求,它以查询字符串的形式将任何参数放到URL中。这与HTTP POST请求相反,其发送额外的数据作为请求消息的主体,而不是作为URL的一部分。

    为了创建一个GTTP GET请求,需要实例化一个HttpGet对象,并传入想要检索的页面的URL。在当前情况下是传入一个URL,指向Apress站点上关于这本书的页面。

1         HttpGet httpget=new HttpGet("http://www.apress.com/book/view/9781430232674");

    随后调用execute方法,将HttpGet对象传递给HttpClient对象以执行该请求。这将返回一个HttpResponse对象。

1             HttpResponse response=httpclient.execute(httpget);

    HttpResponse将包含一个HttpEntity对象,其本质上是一条HTTP消息。请求和响应都包含实体。

1             HttpEntity entity=response.getEntity();

    HttpEntity上的getContent方法将返回一个InputStream,可以使用它来读取在响应中实际发送的内容。

1                 InputStream inputstream=entity.getContent();

    接下来通过一个简短的示例进行说明。

 1 package com.nthm.androidtestActivity;
 2 
 3 import java.io.BufferedReader;
 4 import java.io.IOException;
 5 import java.io.InputStream;
 6 import java.io.InputStreamReader;
 7 import org.apache.http.HttpEntity;
 8 import org.apache.http.HttpResponse;
 9 import org.apache.http.client.HttpClient;
10 import org.apache.http.client.methods.HttpGet;
11 import org.apache.http.impl.client.DefaultHttpClient;
12 import com.nthm.androidtest.R;
13 import android.app.Activity;
14 import android.os.Bundle;
15 import android.util.Log;
16 
17 public class SimpleHTTPRequest extends Activity {
18 
19     @Override
20     protected void onCreate(Bundle savedInstanceState) {
21         super.onCreate(savedInstanceState);
22         setContentView(R.layout.main);

    首先将实例化HttpClient对象和HttpGet对象。

1         HttpClient httpclient=new DefaultHttpClient();
2         HttpGet httpget=new HttpGet("http://www.apress.com/book/view/9781430232674");

    由于HttpClient上的execute方法可能会抛出异常,因此需要将它包装在try/catch块中。

1         try{
2             HttpResponse response=httpclient.execute(httpget);
3             HttpEntity entity=response.getEntity();
4             if(entity!=null){

    如果存在HttpEntity,那么访问InputStream以读取响应。

1                 InputStream inputstream=entity.getContent();

    在InputStream封装在一个BufferedReader中,并利用一个StringBuilder对象来将它变成一个正常的字符串,从而在最后使用它。

 1                 BufferedReader bufferedreader=new BufferedReader(new InputStreamReader(inputstream));
 2                 StringBuilder stringbuilder=new StringBuilder();
 3                 String currentline=null;
 4                 try{
 5                     while((currentline=bufferedreader.readLine())!=null){
 6                         stringbuilder.append(currentline+"\n");
 7                     }
 8                 }catch(IOException e){
 9                     e.printStackTrace();
10                 }

    在完全读取其内容之后,使用StringBuilder对象上的toString方法获取结果字符串,然后调用Log方法将它打印出来。

1                 String result=stringbuilder.toString();
2                 Log.i("SimpleHTTPRequest", result);
3                 inputstream.close();
4             }
5         }catch(Exception e){
6             e.printStackTrace();
7         }
8     }
9 }

    当然,必须有访问Internet的权限,因此需要在AndroidManifest.xml中指定它

1     <uses-permission android:name="android.permission.INTERNE

    既然已经知道如何为一个通用的Web资源生成HTTP请求,现在就让我们看看在请求一个Web服务之后如何处理可能返回的数据类型。接下来将以JSON格式的数据作为开始。

posted on 2014-09-09 15:20  宁静致远,一览众山小  阅读(230)  评论(0编辑  收藏  举报

导航