使用Http访问网络有很多种方式,不过最常用的还是POST和GET方式。项目中正好有用到,因此就写了个工具类,方便以后的使用。
在HttpUtil类里生成一个带Handler的构造参数,之所以要生成一个带Handler的构造参数,是因为在android4.0以后,在activity里请求网络时不能放在主线程。因此通过工具类获取结果以后,把该结果通过handler返回给该界面。
下面上代码:
package com.szh.speechdemo.ui;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
/**
* http工具类,访问方式为post或者get
* @author gh
*/
public class HttpUtil {
private Handler mHandler;
public HttpUtil(Handler handler) {
mHandler = handler;
}
public void getData(Map<String, Object> param, String type, String url) {
try {
if ("get".equals(type)) {
try {
getDataByGet(url);
} catch (Throwable e) {
e.printStackTrace();
}
} else {
getDataByPost(param, url);
}
} catch (Exception e) {
}
}
/**
* 使用post请求方式获取网络数据
*
* @param param
* @param url
*/
private void getDataByPost(final Map<String, Object> param, final String url) {
new Thread(new Runnable() {
@Override
public void run() {
String data = "";
Message message = new Message();
Bundle bundle = new Bundle();
try{
HttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
List<NameValuePair> nameValuePair = new ArrayList<NameValuePair>();
if(param != null){
for(Map.Entry<String, Object> entry :param.entrySet()){
nameValuePair.add(new BasicNameValuePair(entry.getKey(), entry.getValue().toString()));
}
httpPost.setEntity(new UrlEncodedFormEntity(nameValuePair, "utf-8"));
// 执行操作,并拿到结果
HttpResponse response = httpClient.execute(httpPost);
// 获取结果实体
HttpEntity entity = (HttpEntity) response.getEntity();
if(entity != null){
data = EntityUtils.toString(entity,"utf-8");
}
entity.consumeContent();
bundle.putString("data", data);
}
}catch(Exception e){
e.printStackTrace();
data = "服务器连接异常";
bundle.putString("data", data);
}
message.setData(bundle);
mHandler.sendMessage(message);
}
}).start();
}
/**
* 使用get请求方式获取网络数据
*
* @param url
*/
private void getDataByGet(final String url_path) throws Throwable{
new Thread(new Runnable() {
@Override
public void run() {
String jsonString = "";
Message message =new Message();
Bundle bundle = new Bundle();
URL url = null;
try{
url = new URL(url_path);
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setConnectTimeout(6000);
httpURLConnection.setRequestMethod("GET");
// 表示从服务器获取数据
httpURLConnection.setDoOutput(true);
if(httpURLConnection.getResponseCode() == HttpURLConnection.HTTP_OK){
// 表示连接服务器获取数据成功
jsonString = ChangeInputStream(httpURLConnection.getInputStream(),"utf-8");
// 传递消息到主界面,返回校验结果
bundle.putString("data",jsonString);
} else {
jsonString = "连接服务器失败";
bundle.putString("data", jsonString);
}
}catch(Exception e){
jsonString = "连接服务器异常";
bundle.putString("data", jsonString);
}
message.setData(bundle);
mHandler.sendMessage(message);
}
}).start();
}
/**
* 获取的数据结果转变成json
* @param inputStream
* @param string
* @return
*/
protected String ChangeInputStream(InputStream inputStream, String encode) {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
byte[] data = new byte[1024];
int len = 0;
String jsonString = "";
if(inputStream != null){
try{
while((len = inputStream.read(data)) != -1){
outputStream.write(data, 0, len);
}
jsonString = new String(outputStream.toByteArray(),encode);
}catch(Exception e){
e.printStackTrace();
}
}
return jsonString;
}
}
从代码里可以看到,有POST和GET两种请求方式。至于具体用法,举个例子:
package com.szh.speechdemo.activity;
import java.util.HashMap;
import java.util.Map;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import com.szh.speechdemo.ui.HttpUtil;
public class HttpRequestTest extends Activity{
private Handler mHandler = new Handler(){
public void handleMessage(android.os.Message msg) {
String data = msg.getData().getString("data");
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
String url = "写自己的请求路径";
// 创建httputil对象
HttpUtil httpUtil = new HttpUtil(mHandler);
Map<String ,Object> map = new HashMap<String,Object>();
map.put("id","");
// 获取数据,如果是get请求方式,map参数可以是null
httpUtil.getData(map, "post", url);
}
}