`
xuanzhui
  • 浏览: 196921 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

使用原生的HttpURLConnection库进行网络请求

阅读更多

这边只考虑json格式轻量级的数据请求。

 

除了部分像Build.VERSION.SDK_INT这样的只属于android的sdk API,其他是java通用。

 

URL openConnection获取的URLConnection实例由平台和http类型决定,比如安卓从4.4版本开始,http的url底层为com.android.okhttp.internal.http.HttpURLConnectionImpl,如果url是https的那么对应的是HttpsURLConnectionImpl

 

对于Http(s)URLConnection,如果服务器返回的是正常的结果,那么对应的数据可以通过getInputStream获取;但是如果服务器返回的不是正常的结果,例如400,那么需要通过getErrorStream获取详细错误信息。以下的处理是直接通过捕捉IOException处理的,也可以通过getResponseCode先判断服务器状态,比如

HttpURLConnection httpConn = (HttpURLConnection)connection;
InputStream is;
if (httpConn.getResponseCode() >= 400) {
    is = httpConn.getErrorStream();
} else {
    is = httpConn.getInputStream();
}

 

完整的请求

/**
 * http get 请求
 * @param url   请求uri
 * @return      HttpResponse请求结果实例
 */
public static Response httpGet(String url) {

    Response response = null;

    HttpURLConnection httpURLConnection = null;
    try {
        URL urlObj = new URL(url);

        httpURLConnection = (HttpURLConnection) urlObj.openConnection();

        httpURLConnection.setConnectTimeout(XZCache.getInstance().connectTimeout);
        httpURLConnection.setReadTimeout(XZCache.getInstance().readTimeout);

        httpURLConnection.setDoInput(true);

        // 4.0 ~ 4.3 存在EOFException
        if (Build.VERSION.SDK_INT > 13 && Build.VERSION.SDK_INT < 19) {
            httpURLConnection.setRequestProperty("Connection", "close");
        }

        response = readStream(httpURLConnection);

    } catch (MalformedURLException e) {
        e.printStackTrace();

        response = new Response();
        response.content = e.getMessage();
        response.code = -1;
    } catch (IOException e) {
        e.printStackTrace();

        response = new Response();
        response.content = e.getMessage();
        response.code = -1;
    } catch (Exception ex) {
        ex.printStackTrace();
        response = new Response();
        response.content = ex.getMessage();
        response.code = -1;
    } finally {
        if (httpURLConnection != null)
            httpURLConnection.disconnect();
    }

    return response;
}

static Response readStream(HttpURLConnection connection) {
    Response response = new Response();
    
    StringBuilder stringBuilder = new StringBuilder();

    BufferedReader reader = null;
    try {

        reader = new BufferedReader(new InputStreamReader(
                connection.getInputStream(), "UTF-8"));

        int tmp;
        while ((tmp = reader.read()) != -1) {
            stringBuilder.append((char)tmp);
        }

        response.code = connection.getResponseCode();
        response.content = stringBuilder.toString();
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
        response.code = -1;
        response.content = e.getMessage();
    } catch (IOException e) {
        e.printStackTrace();

        try {
            //it could be caused by 400 and so on

            reader = new BufferedReader(new InputStreamReader(
                    connection.getErrorStream(), "UTF-8"));

            //clear
            stringBuilder.setLength(0);

            int tmp;
            while ((tmp = reader.read()) != -1) {
                stringBuilder.append((char)tmp);
            }

            response.code = connection.getResponseCode();
            response.content = stringBuilder.toString();

        } catch (IOException e1) {
            response.content = e1.getMessage();
            response.code = -1;
            e1.printStackTrace();
        } catch (Exception ex) {
            //if user directly shuts down network when trying to write to server
            //there could be NullPointerException or SSLException
            response.content = ex.getMessage();
            response.code = -1;
            ex.printStackTrace();
        }
    } finally {
        if (reader != null) {
            try {
                reader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    return response;
}

//return null means successfully write to server
static Response writeStream(HttpURLConnection connection, String content) {
    BufferedOutputStream out=null;
    Response response = null;
    try {
        out = new BufferedOutputStream(connection.getOutputStream());
        out.write(content.getBytes("UTF-8"));
        out.flush();
    } catch (IOException e) {
        e.printStackTrace();

        try {
            //it could be caused by 400 and so on
            response = new Response();

            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    connection.getErrorStream(), "UTF-8"));

            StringBuilder stringBuilder = new StringBuilder();

            int tmp;
            while ((tmp = reader.read()) != -1) {
                stringBuilder.append((char)tmp);
            }

            response.code = connection.getResponseCode();
            response.content = stringBuilder.toString();

        } catch (IOException e1) {
            response = new Response();
            response.content = e1.getMessage();
            response.code = -1;
            e1.printStackTrace();
        } catch (Exception ex) {
            //if user directly shutdowns network when trying to write to server
            //there could be NullPointerException or SSLException
            response = new Response();
            response.content = ex.getMessage();
            response.code = -1;
            ex.printStackTrace();
        }
    } finally {
        try {
            if (out!=null)
                out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    return response;
}

/**
 * http post 请求
 * @param url       请求url
 * @param jsonStr    post参数
 * @return          HttpResponse请求结果实例
 */
public static Response httpPost(String url, String jsonStr) {
    Response response = null;

    HttpURLConnection httpURLConnection = null;
    try {
        URL urlObj = new URL(url);

        httpURLConnection = (HttpURLConnection) urlObj.openConnection();

        httpURLConnection.setRequestMethod("POST");
        httpURLConnection.setConnectTimeout(XZCache.getInstance().connectTimeout);
        httpURLConnection.setReadTimeout(XZCache.getInstance().readTimeout);
        httpURLConnection.setRequestProperty("Content-Type", "application/json;charset=utf-8");
        httpURLConnection.setDoOutput(true);
        httpURLConnection.setChunkedStreamingMode(0);

        // 4.0 ~ 4.3 存在EOFException
        if (Build.VERSION.SDK_INT > 13 && Build.VERSION.SDK_INT < 19) {
            httpURLConnection.setRequestProperty("Connection", "close");
        }

        //start to post
        response = writeStream(httpURLConnection, jsonStr);

        if (response == null) { //if post successfully

            response = readStream(httpURLConnection);

        }
    } catch (MalformedURLException e) {
        e.printStackTrace();

        response = new Response();
        response.content = e.getMessage();
        response.code = -1;
    } catch (IOException e) {
        e.printStackTrace();

        response = new Response();
        response.content = e.getMessage();
        response.code = -1;
    } catch (Exception ex) {
        ex.printStackTrace();
        response = new Response();
        response.content = ex.getMessage();
        response.code = -1;
    } finally {
        if (httpURLConnection != null)
            httpURLConnection.disconnect();
    }

    return response;
}

public static class Response {
    public Integer code;
    public String content;
}

 

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics