接口返回html页面展示在浏览器
近期做接口对接时,对方直接返回整个html页面,把我整懵了,特此记录下。
网上有很多人提出采用 中转页面 的方式,本文另辟蹊径,采取后端方式解决。
1. 导包
<dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.12.1</version> </dependency>
2. 上代码
package cn.sd.service.impl; import cn.sd.service.SpeedServiceI; import cn.sd.utils.OutKey; import cn.sd.utils.WxApi; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; import java.util.HashMap; import java.util.Map; /** * @author 清风明月 * @description * @date 2019/12/7 18:59 */ @Service public class SpeedServiceImpl implements SpeedServiceI { private static final Logger logger = LoggerFactory.getLogger(SpeedServiceImpl.class); /** * 某公众号的appid */ private String appId = "***********"; /** * 约定的密钥 */ private String clearly = "###########"; @Override public void showHtmlPage(String openId, String phone, String card, HttpServletResponse response) { response.setContentType("text/html;charset=utf-8"); PrintWriter writer; try { writer = response.getWriter(); } catch (IOException e) { writer = new PrintWriter(System.out); logger.error("IO异常:", e); } Map userInfo = WxApi.getUserInfo(appId, openId); logger.info("关注用户信息:" + userInfo); Map bindUserInfo = WxApi.getBindingMobileEntity(appId, openId); logger.info("绑定用户信息:" + bindUserInfo); if (userInfo == null || bindUserInfo == null || userInfo.isEmpty() || bindUserInfo.isEmpty()) { logger.info("请关注【某公众号】并绑定手机号后访问"); writer.println("请关注【某公众号】并绑定手机号后访问"); } else { //1 关注 String subscribe = String.valueOf(userInfo.get("subscribe")); //Y 绑定 String bindStatus = (String) bindUserInfo.get("bindingStatus"); logger.info("bindStatus:" + bindStatus + " && subscribe:" + subscribe); if ("Y".equals(bindStatus) && "1".equals(subscribe)) { //手机号码加密 String nbr = OutKey.encrypt(phone, clearly); //中文加密 String area = OutKey.encrypt(card, clearly); String speedUrl = "http://***.**.***.**:****/***?nbr={nbr}&area={area}&clearly={clearly}"; Map<String, String> map = new HashMap<>(4); map.put("nbr", nbr); map.put("area", area); map.put("clearly", clearly); logger.info("map:{}", map); RestTemplate restTemplate = new RestTemplate(); String html = restTemplate.getForObject(speedUrl, String.class, map); Document document = Jsoup.parse(html); logger.info("document:{}", document); writer.println(document.outerHtml()); } else { logger.info("请绑定手机号后访问"); writer.println("请绑定手机号后访问"); } } writer.close(); } }
不加 response.setContentType("text/html;charset=utf-8"); 的话,中文会变成???
3. 配置文件
application.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!-- 加载静态资源 --> <mvc:annotation-driven /> <mvc:resources mapping="/css/**" location="/css/" /> <mvc:resources mapping="/images/**" location="/images/" /> <mvc:resources mapping="/js/**" location="/js/" /> <!-- 包扫描 --> <context:component-scan base-package="cn.sd.controller, cn.sd.service"/> </beans>
这里没打算说的,但当时自己忘记加静态资源配置了,导致样式未显示出来。(样式、图片等静态资源找对方要)
至此,完成。
除暴安良我心愿,一身正气荡人间