抛弃 Postman 投入 IDEA New Http Client 怀抱

都2020年了,idea也用了大概两三年了,开发工具基本都换成了jetbrain全家桶,pycharm、webstorm、phpstorm、goland、datagrip,竟然今天才发现idea自带的Http Client😂。找了几个刚开发的api接口试用了一番,突然就感觉Postman不够香了! 开始 idea新版的httpclient是直接嵌入到编辑区的,新建一个后缀为http的文件,双击打开后按一定格式编写代码后,即可开始测试api接口 鼠标移动到文件编辑区的右上方有个悬浮按钮,分别为查看历史和示例按钮 点击示例按钮可以看到官方给的常用的http请求示例 按照示例文件编写好代码后,点击左侧的运行按钮即可发送请求 点击查看历史按钮可以看到发送请求的历史记录 环境变量 把httpclient直接嵌入编辑器,够简单够纯粹,已经让我爱不释手了,没想到还有意外惊喜 - 支持定义环境变量。 在项目根目录下新建一个名为http-client.env.json的配置文件,或者如果环境变量里包含敏感信息新建名为http-client.private.env.json的配置文件(idea已经帮我们把这个文件加入git的ignore列表),定义环境变量格式如下: { "local": { "host": "localhost:8081" }, "prod": { "host": "bovod.org" } } 这样就可以在代码中通过{{变量名}}的方式使用环境变量 其他功能 通过简单的回调函数测试响应结果(暂时没用到,可在官方示例里看到) 总结 比Postman更轻量,相比图形界面更简洁,更纯粹!

2020-07-22

springboot 切面开发

pom.xml 添加 AOP 依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> 入口类添加@EnableAspectJAutoProxy注解开启AOP 编写切面类 @Aspect @Component public class AuthAspect { @Autowired HttpServletRequest request; @Autowired protected WaterStationService waterStationService; @Before("execution(* cn.agoodwater.admin.controller.*.*(..))") public void proceed(JoinPoint joinPoint) throws Throwable { System.out.println("进入切点"); String remoteUser = request.getRemoteUser(); if(StringUtils.isNotBlank(remoteUser) && !"admin".equalsIgnoreCase(remoteUser)){ WaterStationBO ws = waterStationService.queryByManager(remoteUser); Object[] obj = joinPoint.getArgs(); for (Object obj1 : obj) { if(!(obj1 instanceof HttpServletResponse)){ Method setWsIdMethod = null; Class<?> aClass = obj1.getClass(); try { setWsIdMethod = aClass.getDeclaredMethod("setWsId",Integer.class); } catch (Exception e) { // } if(setWsIdMethod!=null){ setWsIdMethod.invoke(obj1,ws.getId()); } } } } } }

2020-06-23

springboot 集成 websocket

添加 websocket 依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency> 添加配置WebSocketConfig import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.socket.server.standard.ServerEndpointExporter; @Configuration public class WebSocketConfig { @Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); } } 编写一个WebSocketServer用来收发消息 import cn.agoodwater.admin.ws.vo.WsMsg; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import javax.websocket.*; import javax.websocket.server.PathParam; import javax.websocket.server.ServerEndpoint; import java.io.IOException; import java.util.concurrent.CopyOnWriteArraySet; @Slf4j @ServerEndpoint("/ws/{sid}") @Component public class WebSocketServer { //静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。 private static int onlineCount = 0; //concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。 private static CopyOnWriteArraySet<WebSocketServer> webSocketSet = new CopyOnWriteArraySet<WebSocketServer>(); //与某个客户端的连接会话,需要通过它来给客户端发送数据 private Session session; //接收sid private String sid=""; /** * 连接建立成功调用的方法*/ @OnOpen public void onOpen(Session session,@PathParam("sid") String sid) { this.session = session; webSocketSet.add(this); //加入set中 addOnlineCount(); //在线数加1 log.info("有新窗口开始监听:"+sid+",当前在线人数为" + getOnlineCount()); this.sid=sid; try { sendMessage(0,"连接成功"); } catch (IOException e) { log.error("websocket IO异常"); } } /** * 连接关闭调用的方法 */ @OnClose public void onClose() { webSocketSet.remove(this); //从set中删除 subOnlineCount(); //在线数减1 log.info("有一连接关闭!当前在线人数为" + getOnlineCount()); } /** * 收到客户端消息后调用的方法 * * @param message 客户端发送过来的消息*/ @OnMessage public void onMessage(String message, Session session) { log.info("收到来自窗口"+sid+"的信息:"+message); //群发消息 for (WebSocketServer item : webSocketSet) { try { item.sendMessage(message);// 初始化信息 } catch (IOException e) { e.printStackTrace(); } } } /** * * @param session * @param error */ @OnError public void onError(Session session, Throwable error) { log.error("发生错误"); error.printStackTrace(); } public void sendMessage(Integer type,String message) throws IOException { message = new WsMsg<>(type,message).toString(); this.session.getBasicRemote().sendText(message); } /** * 实现服务器主动推送 */ public void sendMessage(String message) throws IOException { message = new WsMsg<>(message).toString(); this.session.getBasicRemote().sendText(message); } /** * 群发自定义消息 * */ public static void sendInfo(String message,@PathParam("sid") String sid) throws IOException { log.info("推送消息到窗口"+sid+",推送内容:"+message); for (WebSocketServer item : webSocketSet) { try { //这里可以设定只推送给这个sid的,为null则全部推送 if(sid==null) { item.sendMessage(message); }else if(item.sid.equals(sid)){ item.sendMessage(message); } } catch (IOException e) { continue; } } } public static synchronized int getOnlineCount() { return onlineCount; } public static synchronized void addOnlineCount() { WebSocketServer.onlineCount++; } public static synchronized void subOnlineCount() { WebSocketServer.onlineCount--; } } 如果使用了 spring security 需要给 ws 地址放行 .antMatchers("/ws/**").permitAll() 如果使用了 nginx 作反向代理,需要添加如下配置 proxy_read_timeout 3600s; ## 设置超时时间 proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade";

2020-06-18

记一次springmvc 404 错误

今天用户反馈一个操作报错,错误码404,司空见惯了,立马开始排查 @Controller 注解有 @RequestMapping 注解有 @RequestMapping 没加method,理论各种方法都支持,直接拷贝链接贴到浏览器,能访问 给方法加个method=POST,然并卵,GET正常的405错误,POST则404,邪门儿的很(这一步纯粹浪费时间) 妥协了,本地起来找个测试数据看看吧,一切正常,这就尴尬了。。。 检测服务器nginx配置,正常(这一步也是浪费时间) 查看入参,终于发现异样,有个参数定义的Integer,报404的场景传的小数,至此真相大白 //TODO 还有一点没想明白,GET什么参数都不传正常访问,POST什么参数不传也是404,和传错参数类型症状一样,传错参数不是400吗?

2020-06-13

springboot 项目部署方案

第一种:可执行 jar 部署方式 在pom.xml里添加如下配置 <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <executable>true</executable> </configuration> </plugin> 执行 maven 打包命令打成 jar maven package 上传 jar 到服务器后可直接运行 java -jar foo.jar ##后台运行 nohup java -jar foo.jar& 添加到 centos 的服务 ln -s /opt/foo.jar /etc/init.d/foo ##启动服务 service start foo

2020-04-03

idea2019.1破解补丁下载

淘宝买的破解码最近失灵了,到官网看了看最新的价格499刀每年,果然人穷到哪都受鄙视,我一定好好敲代码挣钱,争取早日用上正版。😐 ...

2020-01-17

maven学习笔记

常用命令 ## 安装到本地跳过测试 mvn install -Dmaven.test.skip=true

2019-10-09