鍍金池/ 問答/Java  HTML/ java發(fā)送http請求,無需等待返回結(jié)果

java發(fā)送http請求,無需等待返回結(jié)果

與B項目進行交互,由于B項目一些原因,請求處理緩慢.A項目等待返回結(jié)果需要很久...
現(xiàn)只需發(fā)送數(shù)據(jù)無需判斷發(fā)送成功失敗與否,求教如何操作???
以下是發(fā)送get請求的代碼

    public static String doGet(String HTTP_URL, Object object) {
        BufferedReader reader = null;
        String result = null;
        StringBuffer httpUrl = new StringBuffer(HTTP_URL);
        StringBuffer sbf = new StringBuffer();
        try {
            System.out.println(httpUrl.toString());
            URL url = new URL(httpUrl.toString());
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setDoOutput(true);
            connection.setDoInput(true);
            // 請求方式設置 POST
            connection.setRequestMethod("GET");
            // 設置維持長連接
            connection.setRequestProperty("Connection", "Keep-Alive");
            // 設置文件字符集:
            connection.setRequestProperty("Charset", "UTF-8");
            // 開始連接請求
            connection.connect();
            OutputStream out = connection.getOutputStream();
            out.write((object.toString()).getBytes());
            out.flush();
            out.close();
            if (connection.getResponseCode() == 200) {
                System.out.println("連接成功,傳送數(shù)據(jù)...");
                InputStream is = connection.getInputStream();
                reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
                String strRead = null;
                while ((strRead = reader.readLine()) != null) {
                    sbf.append(strRead);
                    sbf.append("\r\n");
                }
                reader.close();
                result = sbf.toString();
                if (result.equals("1")) {
                    return "1";
                } else if(result.equals("0")) {
                    return "0";
                } else {
                    return result;
                }
            } else {
                System.out.println("連接失敗,錯誤代碼:"+connection.getResponseCode());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
回答
編輯回答
避風港

HttpURLConnection 有個 setReadTimeout 的方法可以實現(xiàn)你的需求。

public static String doGet(String HTTP_URL, Object object) {
        BufferedReader reader = null;
        String result = null;
        StringBuffer httpUrl = new StringBuffer(HTTP_URL);
        StringBuffer sbf = new StringBuffer();
        HttpURLConnection connection = null;
        try {
            System.out.println(httpUrl.toString());
            URL url = new URL(httpUrl.toString());
            connection = (HttpURLConnection) url.openConnection();
            connection.setDoOutput(true);
            connection.setDoInput(true);
            // 請求方式設置 POST
            connection.setRequestMethod("GET");
            // 設置維持長連接
            connection.setRequestProperty("Connection", "Keep-Alive");
            // 設置文件字符集:
            connection.setRequestProperty("Charset", "UTF-8");

            //根據(jù)需求設置讀超時的時間
            connection.setReadTimeout(50);
            // 開始連接請求
            connection.connect();
            OutputStream out = connection.getOutputStream();
            out.write((object.toString()).getBytes());
            out.flush();
            out.close();
            if (connection.getResponseCode() == 200) {
                System.out.println("連接成功,傳送數(shù)據(jù)...");
                InputStream is = connection.getInputStream();
                reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
                String strRead = null;
                while ((strRead = reader.readLine()) != null) {
                    sbf.append(strRead);
                    sbf.append("\r\n");
                }
                reader.close();
                result = sbf.toString();
                if (result.equals("1")) {
                    return "1";
                } else if(result.equals("0")) {
                    return "0";
                } else {
                    return result;
                }
            } else {
                System.out.println("連接失敗,錯誤代碼:" + connection.getResponseCode());
            }
        } catch (Exception e) {
            if(e instanceof SocketTimeoutException) {
                if("Read timed out".equals(e.getMessage()) && connection != null && connection.getDoOutput()) {
                    //TODO 只請求不需要響應
                    return null;
                }
            }
            e.printStackTrace();
        }
        return null;
    }
2018年1月26日 19:52
編輯回答
壞脾滊

如果是使用spring,可以使用@Async來做異步。
如果不是可以自定義線程池,把發(fā)送請求的任務execute提交到線程池中進行處理。


如果后面還想獲得該http請求的返回值,請使用submit提交任務,會返回一個Future,future.get()會阻塞至直到獲得該任務的結(jié)果。

2018年4月15日 01:16
編輯回答
浪蕩不羈
 public static String doGet(String HTTP_URL, Object object) {
        BufferedReader reader = null;
        String result = null;
        StringBuffer httpUrl = new StringBuffer(HTTP_URL);
        StringBuffer sbf = new StringBuffer();
        try {
            System.out.println(httpUrl.toString());
            URL url = new URL(httpUrl.toString());
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setDoOutput(true);
            connection.setDoInput(true);
            // 請求方式設置 POST
            connection.setRequestMethod("POST");
            // 設置文件字符集:
            connection.setRequestProperty("Charset", "UTF-8");
            // 開始連接請求
            connection.connect();
            OutputStream out = connection.getOutputStream();
            out.write((object.toString()).getBytes());
            out.flush();
            out.close();
            if (connection.getResponseCode() == 200) {
                System.out.println("連接成功,傳送數(shù)據(jù)...");
               
            } else {
                System.out.println("連接失敗,錯誤代碼:"+connection.getResponseCode());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
2017年4月23日 04:17