本文最后更新于:June 30, 2023 pm
本文作者:[wangwenhai] # 概要:快速实现一个Http回调组件->
快速实现一个Http回调组件
一、前情回顾
我们平时在使用一些库的时候,会遇到一些看起来很舒服的写法,用起来感觉很简单,而且写法也很优雅,比如OkHttp,或者是Java Swing的事件模式。
我们先看看Java的事件是怎么写的:
public static void main(String[] args) {
JFrame jf = new JFrame("事件监听测试");
jf.setVisible(true);
jf.setSize(100, 200);
JButton jb = new JButton("触发事件");
jf.add(jb);
jb.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 进行逻辑处理即可
System.out.println("触发了事件");
}
});
}
我们看到Swing的写法是直接给组件添加了一个监听器,然后回调里面的参数,这种写法看起来仿佛就是组件自带了某种动作一样。
我们接下来也实现一个简单的Http get请求回调。
二、组件设计
1.回调接口
public interface HttpRequestHandler {
void onSuccess(String result);
void onException(Exception e);
}
2.处理器
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class HttpRequestProxy {
private HttpRequestHandler httpRequestHandler;
public HttpRequestProxy(HttpRequestHandler httpRequestHandler) {
this.httpRequestHandler = httpRequestHandler;
}
/**
* 模拟GET
*
* @param urlString
* @return
*/
public String get(String urlString) {
HttpURLConnection connection = null;
InputStream is = null;
BufferedReader br = null;
String result = null;// 返回结果字符串
try {
// 创建远程url连接对象
URL url = new URL(urlString);
// 通过远程url连接对象打开一个连接,强转成httpURLConnection类
connection = (HttpURLConnection) url.openConnection();
// 设置连接方式:get
connection.setRequestMethod("GET");
// 设置连接主机服务器的超时时间:15000毫秒
connection.setConnectTimeout(15000);
// 设置读取远程返回的数据时间:60000毫秒
connection.setReadTimeout(60000);
// 发送请求
connection.connect();
// 通过connection连接,获取输入流
if (connection.getResponseCode() == 200) {
is = connection.getInputStream();
// 封装输入流is,并指定字符集
br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
// 存放数据
StringBuffer sbf = new StringBuffer();
String temp;
while ((temp = br.readLine()) != null) {
sbf.append(temp);
sbf.append("\r\n");
}
result = sbf.toString();
this.httpRequestHandler.onSuccess(result);
}
} catch (IOException e) {
this.httpRequestHandler.onException(e);
} finally {
// 关闭资源
if (null != br) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != is) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
assert connection != null;
connection.disconnect();// 关闭远程连接
}
return result;
}
}
3.调用
public class Main {
public static void main(String[] args) {
new HttpRequestProxy(new HttpRequestHandler() {
@Override
public void onSuccess(String result) {
System.out.println(result);
}
@Override
public void onException(Exception e) {
e.printStackTrace();
}
}).get("http://www.baidu.com");
}
}
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!