Android中Http的Get与Post

网上已经有很多关于http的get与post的文章,不过,我还是将我的实现方式写了出来,主要的区别在于,我的调用函数,有几个优点:
1,做了一个工具类,集成到工程中比较方便;
2,可以直接调用,不需要new一个对象;
3,将返回数据的处理,转到调用者的handler中来处理。

下面是一个HttpUtils的工具类,里面就是两个函数:httpGet,httpPost。

package com.develop.app.httptest;

import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;

public class HttpUtils {

    public static int httpGet(final Context context, final String urlPath, final Handler mHandler, final int msgWhat) {

        new Thread() {

            @Override
            public void run() {

                int statusCode = -1;
                String content = "";

                // ---------------------请求数据-----------------------
                try {
                    URL url = new URL(urlPath.trim());
                    Log.i("logB", "send url=" + url.toString());

                    //打开连接
                    HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();

                    statusCode = urlConnection.getResponseCode();

                    if (200 == urlConnection.getResponseCode()) {
                        //得到输入流
                        InputStream is = urlConnection.getInputStream();
                        ByteArrayOutputStream baos = new ByteArrayOutputStream();
                        byte[] buffer = new byte[1024];
                        int len = 0;
                        while (-1 != (len = is.read(buffer))) {
                            baos.write(buffer, 0, len);
                            baos.flush();
                        }
                        content = baos.toString("utf-8");
                        sendHandler(context, mHandler, msgWhat, content, statusCode);
                    } else {
                        sendHandler(context, mHandler, msgWhat, content, statusCode);
                    }
                } catch (MalformedURLException e) {
                    sendHandler(context, mHandler, msgWhat, content, statusCode);
                    e.printStackTrace();
                } catch (IOException e) {
                    sendHandler(context, mHandler, msgWhat, content, statusCode);
                    e.printStackTrace();
                }
            }
        }.start();
        return 0;
    }

    public static void httpPost(final Context context,final String urlPath, final String content, final Handler handler, final int msgWhat){

        new Thread()
        {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                Looper.prepare();
                URL url;
                try {
                    url = new URL(urlPath);
                    Log.i("logB","content="+content);
                    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                    conn.setConnectTimeout(10000);//5
                    conn.setReadTimeout(10000);
                    conn.setDoOutput(true);// 设置允许输出
                    conn.setRequestMethod("POST");
                    conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)");// "Fiddler"
                    conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
                    conn.setRequestProperty("Charset", "UTF-8");

                    OutputStream os = conn.getOutputStream();
                    os.write(content.getBytes());
                    os.close();

                    /* 服务器返回的响应码 */
                    int code = conn.getResponseCode();
                    Log.i("logB","code="+code);
                    if (code == 200) {
                        BufferedReader in = new BufferedReader(
                                new InputStreamReader(conn.getInputStream(), "UTF-8"));
                        String retData = null;
                        String responseData = "";
                        while ((retData = in.readLine()) != null) {
                            responseData += retData;
                        }
                        Log.i("logB","responseData="+responseData);
                        in.close();
                        sendHandler(context,handler,msgWhat,responseData,code);
                    } else {
                        sendHandler(context,handler,msgWhat,"",code);
                    }
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                    Log.i("logB","MalformedURLException");
                    sendHandler(context,handler,msgWhat,"",-1);
                } catch (IOException e) {
                    e.printStackTrace();
                    Log.i("logB","IOException");
                    sendHandler(context,handler,msgWhat,"",-1);
                } catch (Exception e) {
                    // TODO: handle exception
                    e.printStackTrace();
                    sendHandler(context,handler,msgWhat,"",-1);
                }
                Looper.loop();
            }

        }.start();
    }

    private static void sendHandler(Context context, Handler mHandler, int msgWhat, String content, int statusCode){

        if (context != null) {
            Message msg = mHandler.obtainMessage(msgWhat);
            Bundle bundle = new Bundle();
            bundle.putString("content", content); // 往Bundle中存放数据
            bundle.putInt("statusCode", statusCode); // 往Bundle中存放statusCode
            msg.setData(bundle);
            mHandler.sendMessage(msg);
        }
    }

}

调用的Activity中的代码如下:

package com.develop.app.httptest;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import org.json.JSONObject;

public class MainActivity extends Activity {

    private Button btn_register, btn_login;
    private EditText et_user_name, et_password;

    //防止按钮连续点击
    private static long lastClickTime=0;
    private boolean islanServertest=true;//false

    static final int UPDATE_REGISTER =1001;
    static final int QUERY_LOGIN =1002;

    /**
     * 创建一个Handler实例,用于接收支付查询返回消息
     */
    private final  Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {

            String text;
            int statusCode;

            switch (msg.what) {

            case UPDATE_REGISTER:
                statusCode = msg.getData().getInt("statusCode");
                Log.i("logB","QUERY_REGISTER: statusCode="+statusCode);
                if(statusCode==200){
                    text = msg.getData().getString("content");
                    if((text!=null) && (text.length()>2)){
                        text = text.replace("\"", "");
                    }
                    Log.i("logB","get content="+text);
                } else if(statusCode == 500){
                    Toast.makeText(MainActivity.this,"服务器异常,请稍后重试",Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(MainActivity.this,"网络错误,请重试",Toast.LENGTH_SHORT).show();
                }
                break;
            case QUERY_LOGIN:
                statusCode = msg.getData().getInt("statusCode");
                Log.i("logB","QUERY_LOGIN: statusCode="+statusCode);
                if(isFinishing()){
                    Log.i("logB","activity isFinishing");
                    return;
                }
                String strHintTryAgain="";
                if(statusCode==200){
                    try {
                        text = msg.getData().getString("content");//content;
                        Log.i("logB", "get content=" + text);
                        JSONObject jb = new JSONObject(text);
                        String result = jb.getString("result");
                        if (result.equals("fail")) {
                            strHintTryAgain = "注册失败,请重试";
                        } else if (result.equals("success")) {
                            strHintTryAgain = "注册成功!";
                        } else {
                            strHintTryAgain = "信息提交中心,网络错误,请重试";
                        }
                    } catch (Exception e){
                        e.printStackTrace();
                    }
                } else if(statusCode == 500){
                    strHintTryAgain = "服务器异常,请稍后重试";
                } else {
                    strHintTryAgain = "网络错误,请重试";
                }
                Toast.makeText(MainActivity.this, strHintTryAgain, Toast.LENGTH_SHORT).show();
                break;
            }
        }        
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initView();
    }

    private void initView() {
        et_user_name = (EditText) findViewById(R.id.et_user_name);
        et_password = (EditText) findViewById(R.id.et_password);

        btn_register = (Button) findViewById(R.id.btn_register);
        btn_login = (Button) findViewById(R.id.btn_login);
        btn_register.setOnClickListener(new LoginOnClickListener());
        btn_login.setOnClickListener(new LoginOnClickListener());
    }

    // 登录事件
    public class LoginOnClickListener implements View.OnClickListener {

        @Override
        public void onClick(View v) {
            if (v == btn_register) {
                //若是连续点击,只响应第一次
                if(isContinuousClick()){
                    return;
                }
                try {
                    String strUserName = et_user_name.getText().toString().trim();
                    String strPassword = et_password.getText().toString().trim();
                    StringBuilder sb = new StringBuilder();
                    String url;
                    if(islanServertest) {
                        sb.append("name=" + strUserName);
                        sb.append("&password=" + strPassword);
                        Log.i("logB", "params=" + sb.toString());
                        url = "http://192.168.100.100:8080/WebTest/api/register";
                    } else {
                        url = "http://www.baidu.com";
                    }
                    Log.i("logB","url="+url);
                    HttpUtils.httpPost(MainActivity.this,
                            url,
                            sb.toString(),
                            mHandler,
                            UPDATE_REGISTER
                            );
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            } else if(v == btn_login){
                //若是连续点击,只响应第一次
                if(isContinuousClick()){
                    return;
                }
                String strUserName = et_user_name.getText().toString().trim();
                String strPassword = et_password.getText().toString().trim();
                StringBuilder sb = new StringBuilder();
                String url;
                if(islanServertest) {
                    sb.append("name=" + strUserName);
                    sb.append("&password=" + strPassword);
                    Log.i("logB", "params=" + sb.toString());
                    url = "http://192.168.100.100:8080/WebTest/api/login"+"?"+sb.toString();
                } else {
                    url = "http://www.baidu.com";
                }

                Log.i("logB","url="+url);
                HttpUtils.httpGet(MainActivity.this,
                        url,
                        mHandler,
                        QUERY_LOGIN
                );
            }
        }
    }

    private boolean isContinuousClick(){
        //若连续点击,只响应第一次,并且提示。只提示第一次的连续点击,避免长时间显示提示信息。
        //Toast.LENGTH_LONG(3.5秒)和Toast.LENGTH_SHORT(2秒)
        long time = System.currentTimeMillis();
        if ( time - lastClickTime < 2000) {
            Log.i("logB","isFastDoubleClick, ignore this click");
            return true;
        }
        lastClickTime = time;
        return false;
    }

}

说明:
我定义了一个成员变量 islanServertest,来切换是否在本地局域网测试,还是在internet上测试。

private boolean islanServertest=true;//false

若是internet,使用的是百度网站;若是局域网,使用的是一个本地的服务器,将在下一篇博客中说明搭建的方法。

本文demo见如下地址:
http://download.csdn.net/detail/lintax/9777979

猜你喜欢

转载自blog.csdn.net/lintax/article/details/61422989