Android中Http的Get与Post

来源:互联网 发布:为什么蔬菜不好吃知乎 编辑:程序博客网 时间:2024/06/02 02:32

网上已经有很多关于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

0 0