首页 > 技术文章 > HttpUrlConnection使用Get和Post访问服务器的工具类(一)

Liang-Blog 2016-08-15 20:17 原文

首先我们有一个返回响应的接口HttpCallBackListener

public  interface  HttpCallbackListener {
    void onFinish(String response);

    void onError(Exception e);
}

然后就是工具类的主体了

import android.util.Log;

import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;

import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Map;

public class HttpUtil {
    //使用Get方法,path存储一个网址,Map存储一个键值对
    public static void sendHttpRequestForGet(final String path,final Map<String,String> params , final HttpCallbackListener listener){
        new Thread(new Runnable() {
            @Override
            public void run() {
                HttpURLConnection connection=null;

                try{
                    StringBuilder stringBuilder=new StringBuilder();
                    StringBuilder response=new StringBuilder();
                    stringBuilder.append(path).append("?");
                    if(params!=null&&params.size()!=0){
                        for(Map.Entry<String,String> entry:params.entrySet()){
                            //转换成UTF-8
                            stringBuilder.append(entry.getKey()).append("=").append(URLEncoder.encode(entry.getValue(),"utf-8"));
                            stringBuilder.append("&");
                        }
                        //删除最后一个字符&
                        stringBuilder.deleteCharAt(stringBuilder.length() - 1);
                    }
                    //此时网址变长了,增加了Map中的内容
                    URL url=new URL(stringBuilder.toString());
                    //打印网址
                    Log.e("HttpUtil",stringBuilder.toString());

                    connection=(HttpURLConnection)url.openConnection();
                    connection.setRequestMethod("GET");
                    connection.setConnectTimeout(100000);
                    connection.setReadTimeout(100000);
                    connection.setRequestProperty("Content-Type", "application/json");
                    //200表示连接成功
                    if(connection.getResponseCode()==200){
                        InputStream in=connection.getInputStream();
                        BufferedReader reader=new BufferedReader(new InputStreamReader(in,"utf-8"));
                        String line;
                        while ((line=reader.readLine())!=null){
                            response.append(line);
                        }
                    }else{
                        System.out.println(connection.getResponseCode());
                        Log.e("HttpUtil","fail");
                    }
                    if(listener!=null){
                        Log.e("HttpUtil",response.toString());
                        //把response转换为String类型再作为参数传入,以便调用他的类访问
                        listener.onFinish(response.toString());
                    }
                }catch(Exception e){
                    if (listener!=null){
                        listener.onError(e);
                    }
                }finally {
                    if(connection!=null){
                        connection.disconnect();
                    }
                }
            }
        }).start();
    }

    public static void sendHttpRequestForPost(final String path,final Map<String,String> paramsValue, final HttpCallbackListener listener){
        new Thread(new Runnable() {
            @Override
            public void run() {
                HttpURLConnection connection=null;
                try{
                    StringBuilder response=new StringBuilder();
                    JSONObject jsonObject = new JSONObject();
                    for(Map.Entry<String,String> entry:paramsValue.entrySet()){
                        jsonObject.put(entry.getKey(),entry.getValue());
                    }
                    URL url=new URL(path);
                    connection=(HttpURLConnection) url.openConnection();
                    connection.setRequestMethod("POST");
                    connection.setConnectTimeout(100000);
                    connection.setReadTimeout(100000);
                    connection.setDoOutput(true);
                    connection.setDoInput(true);
                    //千万要记着这个setRequestProperty
                    connection.setRequestProperty("Content-Type", "application/json;charset=UTF-8");
                    Log.d("HttpUtil", jsonObject.toString());
                    //将数据写给服务器
                    DataOutputStream out= new DataOutputStream(connection.getOutputStream());
                    out.writeBytes(jsonObject.toString());
                    Log.d("HttpUtil",jsonObject.toString());
                    //成功
                    if(connection.getResponseCode()==200){
                        Log.d("HttpUtil", "success");
                        InputStream in=connection.getInputStream();
                        BufferedReader reader=new BufferedReader(new InputStreamReader(in,"utf-8"));
                        String line;
                        while ((line=reader.readLine())!=null){
                            response.append(line);
                        }
                    }else{
                        Log.e("HttpUtil",Integer.toString(connection.getResponseCode()));
                        Log.e("HttpUtil","fail");
                    }
                    if(listener!=null){
                        Log.e("HttpUtil","注册成功");
                        Log.e("HttpUtil",response.toString());
                        listener.onFinish(response.toString());
                    }
                }catch(Exception e){
                    if (listener!=null){
                        Log.d("HttpUtil",e.getMessage());
                        listener.onError(e);
                    }
                }finally {
                    if(connection!=null){
                        connection.disconnect();
                    }
                }
            }
        }).start();
    }
}

假设我们要在MainActivity中访问

httpUtil.sendHttpRequestForGet("http://210.38.111.146:8080/WindBell/rest/login", map, new HttpCallbackListener() {
                            @Override
                            public void onFinish(String response) {
                                //得到了response后就方便多了
                            }

                            @Override
                            public void onError(Exception e) {

                            }
                        });

 

推荐阅读