Android实战开发---请求接口获取数据
上文中我们看过了项目的整体框架,趁着写接口的间隙,和大家一起研究一下读取接口的类:XMLTool.java。
说实话,自己的项目名字感觉起的都不怎么好,XMLTool很容易让人以为是与XML有关的工具,谁也不会想到是请求接口的一系列方法,这里以后肯定要改进,这回我们还是以代码分析为主。
在这个类中,我们有几个主要的方法,分别是GetXmlValue、PostXmlValue、DeleteXmlValue、UploadImagFile、ReturnXMLValue、DownloadFile2SDCard、GetInputStreamFromUrl这七个方法。基本上常用的请求操作都用到了,从名字应该可以看出大概的作用,下面我们一一说明,并指出其中的一些主要代码。
我们的接口是REST格式,也就是有四种状态get获取数据、post新增/修改数据、put修改数据(未用)、delete删除数据。
1. GetXmlValue
这个方法很明显,是用来进行get提交并取得数据。使用的是比较常用的方法,大家看看代码也就明白了:
StringBuffer sbResult = new StringBuffer();
// 创建一个http客户端
HttpClient client = new DefaultHttpClient();
// 创建一个GET请求
HttpGet httpGet = new HttpGet(url);
// 向服务器发送请求并获取服务器返回的结果
HttpResponse response = null;
// 返回的结果可能放到InputStream,http Header中等。
InputStream inputStream = response.getEntity().getContent();
// 读取内容
BufferedReader br = new BufferedReader(new InputStreamReader(
inputStream, "utf-8"));
String data = "";
if (sbResult.toString().equalsIgnoreCase("")) {
while ((data = br.readLine()) != null) {
sbResult.append(data);
}
}
inputStream.close();
这段代码应该是网络上比较常见的了,也不用我过多的解释了。
2. PostXmlValue
这个是使用post提交数据,用于新增、修改数据。其中主要是参数的添加,这里我从外面传入一个HashMap并转为List<BasicNameValuePair>,代码如下:
……
// 创建一个POST请求
HttpPost httpPost = new HttpPost(url);
//添加post参数
List<BasicNameValuePair> dataList = new ArrayList<BasicNameValuePair>();
Iterator<Map.Entry<String, String>> i = param.entrySet().iterator();
while (i.hasNext()) {
Map.Entry<String, String> o = (Map.Entry<String, String>) i.next();
dataList.add(new BasicNameValuePair(o.getKey().toString(), o.getValue().toString()));
}
HttpEntity entity = entity = new UrlEncodedFormEntity(dataList, "UTF-8");
httpPost.setEntity(entity);
……
3. DeleteXmlValue
Delete方法就比较简单了,和get方法类似,不过就是将HttpGet改成HttpDelete对象而已。
// 创建一个Delete请求
HttpDelete httpDelete = new HttpDelete();
4. UploadImagFile
这是一个上传图片的方法,主要是上传一些小的图片文件之类,用的也是比较普遍的二进制流的上传方式。
将文件读取到一个FileInputStream对象中,然后通过DataOutputStream的write方法写入请求中,这里要注意的是一些参数的添加,比如上传的文件名怎么定义之类的。
sb1.append("Content-Disposition: form-data; name=\"do_img\"; filename=\""+ file.getName() + "\"" + LINEND);
outStream.write(sb1.toString().getBytes());
其实这段代码自己也是似懂非懂,我们就留作最后的提高部分供大家探讨,也希望有高手能将这段代码全标上注释供大家理解。
5. ReturnXMLValue
这个方法就是在上面的GetXmlValue中的// 返回的结果可能放到InputStream,http Header中等。后面那一段,因为每个请求都会用到,所以提了出来。
6. DownloadFile2SDCard
这个方法应该看名字能看出来,下载文件到手机卡上。
其中FileTool是另外一个工具类,用于一些文件的创建、查找方面的工作,我们以后再介绍,这里只是取得inputstream后调用FileTool中的方法来进行操作,所以就不多介绍,留待以后介绍FileTool类时再说。
7. GetInputStreamFromUrl
获取连接inputstream方法,返回的是conn.getInputStream()。
这就是我用来请求接口的类,其实还是比较粗糙的,但基本功能都没问题,而且在上一版本的使用中也并没有出现过什么问题,因此还算是比较好用的一个工具类。下面附上全部的代码供参考。
package hb.hbwb.tools;
/**
* @name XML数据处理类
* @author zhang.yue
* @create_date 20110512
* @last_edit_author zhang.yue
* @last_edit_date 20111115
* @remark
* @edit_remark 优化代码
*/
import hb.hbwb.R;
import hb.hbwb.finals.SystemFinals;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URI;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpDelete;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHtt
补充:移动开发 , Android ,