网络请求封装类lmxHttpUrlConnection

  由于android在api23及以上的版本中废弃了httpclient,所以用了之前lmxHttpClient同样的方法,将请求完成的业务逻辑抽象后封装了httpUrlConnection,方式是一样的。

  虽然也可以在高于23的版本下继续使用httpclient,方式见http://blog.csdn.net/u014727233/article/details/51985429,不过早晚还是要换的吧,以下个人代码,错误之处望指正

  工具类lmxHttpUrlConnection的代码如下

lmxHttpUrlConnection:

package com.newbest.smarthome.androidtest0802_not_important;

import android.util.Log;

import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;

/**
 * Created by limengxiao on 16/8/2.
 */
public abstract class lmxHttpUrlConnection {

    //    time out value in milliseconds
    public static final int TIME_OUT = 5000;
    //    Basic request address
    public static String URL_STR;
    //    Encoding type in this request,such as "utf-8"
    public static String ENCODING;
    //    Request data in form of string
    // such as "username=limengxiao&password=123456"
    public static String DATA_STR;

    //    Constructor can either use DATA_STR or DATA_MAP as data resource
    //    if no data resource is needed,use "" or null instead
    public lmxHttpUrlConnection(String basicUrl, String encoding, String dataStr) {

        this.URL_STR = basicUrl;
        this.ENCODING = encoding;
        if (dataStr == null || dataStr == "") {
            this.DATA_STR = null;
        } else {
            this.DATA_STR = dataStr;
        }

    }

    //    Request data in form of hashmap
    // for example the hashmap has called "hashmap.put("username","limengxiao")" and "hashmap.put("username","limengxiao")"
    public lmxHttpUrlConnection(String basicUrl, String encoding, HashMap<String, String> dataMap) {

        this.URL_STR = basicUrl;
        this.ENCODING = encoding;
        try {
            this.DATA_STR = getFormedDataString(dataMap);
        } catch (UnsupportedEncodingException e) {
            Log.i("res", "lmx:encoding error occurs when encoding the specified encoding type to the value of the dataMap");
            e.printStackTrace();
        }

    }

    public String getFormedDataString(HashMap<String, String> map) throws UnsupportedEncodingException {
        if (map == null) {
            return null;
        } else {
            Set<String> keySet = map.keySet();
            if (keySet.size() == 0) {
                return null;
            }
            Iterator<String> it = keySet.iterator();
            StringBuilder sb = new StringBuilder();
            while (it.hasNext()) {
                String keyStr = it.next();
                Log.i("res", "keyStr-->" + keyStr);
                String valStr = map.get(keyStr);
                Log.i("res", "valStr-->" + valStr);
//            Format encoding of the value
                valStr = URLEncoder.encode(valStr, ENCODING);
                sb.append(keyStr + "=" + valStr + "&");
            }
//            Remove last '&',if exists
            Log.i("res", "line 78,sb.toString()-->" + sb.toString());
            String lastChar = sb.charAt(sb.length() - 1) + "";
            if (lastChar.equals("&")) {
                sb.deleteCharAt(sb.length() - 1);
            }
            Log.i("res", "data String-->" + sb.toString());
            return sb.toString();
        }
    }


    public abstract void onSuccess(String resultStr);

    public abstract void onFailure(String errorStr);

    public void doPost() {
        new Thread() {
            @Override
            public void run() {

                try {
                    URL url = new URL(URL_STR);
                    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
//                          To upload data to a web server, configure the connection for output using setDoOutput(true).
                    connection.setDoOutput(true);
                    connection.setDoInput(true);
                    connection.setChunkedStreamingMode(0);
                    connection.setRequestMethod("POST");
                    connection.setUseCaches(false);
                    connection.setConnectTimeout(TIME_OUT);
                    connection.setReadTimeout(TIME_OUT);
                    connection.setRequestProperty("Accept_Encoding", ENCODING);
                    connection.setRequestProperty("Connection", "keep-alive");
                    connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
                    if (DATA_STR != null) {
                        connection.setRequestProperty("Content-Length", String.valueOf(DATA_STR.getBytes().length));
                    }
                    OutputStream out = new BufferedOutputStream(connection.getOutputStream());
                    out.write(DATA_STR.getBytes());
                    out.flush();
                    if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
                        InputStream is = connection.getInputStream();
                        ByteArrayOutputStream baos = new ByteArrayOutputStream();
                        int lenth = 0;
                        byte buffer[] = new byte[1024];
                        while ((lenth = is.read(buffer)) != -1) {
                            baos.write(buffer, 0, lenth);
                        }
                        is.close();
                        baos.close();
                        String resultStr = new String(baos.toByteArray());

                        onSuccess(resultStr);

                    } else {
                        onSuccess("请求返回数据状态吗不是200(请求失败)");
                    }

                } catch (MalformedURLException e) {
                    e.printStackTrace();
                    Log.i("res", "lmx:-->Url Error,type-->MalformedURLException,info-->" + e.toString());
                    onFailure(e.toString());
                } catch (IOException e) {
                    e.printStackTrace();
                    Log.i("res", "lmx:-->IOException,info" + e.toString());
                    onFailure(e.toString());
                }

            }
        }.start();
    }

    public void doGet() {
        new Thread() {
            @Override
            public void run() {
                HttpURLConnection connection = null;
                try {
                    String basicUrlStr = URL_STR;
//                  Open to enable auto add "?" to basic url in get methods
//                  In get method,If the url string does not have a "?" at the end of the string,add a "?"
                    /*if (!basicUrlStr.endsWith("?")) {
                        basicUrlStr += "?";
                    }*/
                    if (DATA_STR != null) {
                        basicUrlStr += DATA_STR;
                    }
                    Log.i("res", "Full url of GET request:-->\n" + basicUrlStr);
                    URL url = new URL(basicUrlStr);
                    connection = (HttpURLConnection) url.openConnection();
                    connection.setRequestMethod("GET");
                    connection.setReadTimeout(TIME_OUT);
                    connection.setConnectTimeout(TIME_OUT);
                    if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
                        InputStream is = connection.getInputStream();
                        ByteArrayOutputStream baos = new ByteArrayOutputStream();
                        int len = 0;
                        byte buffer[] = new byte[1024];
                        while ((len = is.read(buffer)) != -1) {
                            baos.write(buffer, 0, len);
                        }
                        is.close();
                        baos.close();
                        String resultStr = new String(baos.toByteArray());
                        onSuccess(resultStr);
                    } else {
//                  The resoponseCode is not 200
                        onFailure("lmx,getMethod,onFailure-->the return code is-->" + connection.getResponseCode());
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    Log.i("res", "lmx:url parse error,info-->" + e.toString());
                    onFailure("lmx:url parse error,info-->" + e.toString());
                }
            }
        }.start();
    }

    ;

}

使用方式与之前我封装的lmxHttpclient基本一样,区别在于这次代码可以允许不带参数的get/post请求

MainActivity部分代码:

post部分,使用公司内网的请求地址

String url = "http://192.168.1.188:80/login";
                HashMap<String, String> map = new HashMap<String, String>();
                map.put("username", "admin");
                map.put("password", "123456");
                lmxHttpUrlConnection postConn = new lmxHttpUrlConnection(url, "utf-8", map) {
                    @Override
                    public void onSuccess(String resultStr) {
                        Log.i("res", "请求成功,返回字符串-->\n" + resultStr);
                    }

                    @Override
                    public void onFailure(String errorStr) {
                        Log.i("res", "请求失败,返回字符串-->" + errorStr);
                    }
                };
                postConn.doPost();

get部分,使用心知天气接口(聚合审核没通过,暂时用下这个)

HashMap<String, String> xzMap = new HashMap<String, String>();
                xzMap.put("key", "这里是我的key");
                xzMap.put("location", "shanghai");
                xzMap.put("language", "zh-Hans");
                xzMap.put("unit", "c");

                lmxHttpUrlConnection getConn = new lmxHttpUrlConnection(BASIC_URL_XINZHI, "utf-8", xzMap) {
                    @Override
                    public void onSuccess(String resultStr) {
                        Log.i("res", "请求成功-->" + resultStr);
                    }

                    @Override
                    public void onFailure(String errorStr) {
                        Log.i("res", "请求失败-->" + errorStr);
                    }
                };

                getConn.doGet();

以上,不用在工作线程中调用,抽象方法onSuccess/onFailure也不用runOnUiThread(),这些都在doGet()、doPost()里写好了

运行结果

公司内网post返回值






测试运行通过 2016.8.2


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值