Android-Http方式请求网络

使用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);
    }
}

猜你喜欢

转载自blog.csdn.net/little_soybean/article/details/79253915