java实现实时获取新闻资讯、幽默有趣的文案

228 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 2 天,点击查看活动详情

简介

本文主要通过第三方平台接口,根据个人所需进行包装整理,输出个人所需的文案效果。

接口平台

在这里我们主要使用天行数据平台提供接口支持,平台主要提供各类新闻、早安晚安短语、神回复段子等接口,可根据个人喜欢进行注册使用。平台有提供免费接口,有意向的可以自己注册一个账号看看。

image.png

服务搭建

使用idea创建一个spring-boot项目,这里我们使用的是2.2.5.RELEASE版本:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.5.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

该项目主要通过本地定义接口,通过http协议调用第三方API接口获取相应数据,根据个人需要做号数据转换,主要使用maven做依赖管理,pom文件模块依赖如下:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<!-- lombok提高开发效率 -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.22</version>
</dependency>

<!-- http服务包,调用第三方api -->
<dependency>
    <groupId>commons-httpclient</groupId>
    <artifactId>commons-httpclient</artifactId>
    <version>3.1</version>
</dependency>

<!-- json转换包 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.80</version>
</dependency>

接口定义与实现

  • 创建TianXingController控制器接口,这里以神回复、it新闻资讯为例:
@RestController
@RequestMapping("/tianxing")
public class TianXingController {

    @Autowired
    private ITianXingService tianXingService;

    @GetMapping("/godreply")
    public String godReply() {
        return tianXingService.godReply();
    }
    
    @GetMapping("/itnews")
    public String itNews() {
        return tianXingService.itNews();
    }
}
  • ITianXingService接口定义:
public interface ITianXingService {

    /**
     * 神回复
     * @return
     */
    String godReply();

    /**
     * IT资讯
     * @return
     */
    String itNews();

}
  • 天行API接口地址信息:
public interface TxApiConstants {

    // 注册后通过平台获取
    String CZB_API_KEY = "7e3443****************0668";

    /**
     * 神回复
     */
    String GOD_REPLY = "/godreply/index?key=" + CZB_API_KEY;

    Integer NEWS_NUM = 10;

    /**
     * IT新闻
     */
    String NEWS_TYPE_IT = "/it/index?key=" + CZB_API_KEY + "&num=%s";
}
  • 根据自己需要,随便点击一个接口进去即可看到详细接口信息: image.png

  • service接口实现:

@Slf4j
@Service
public class TianXingServiceImpl implements ITianXingService {

	@Autowired
        private TianXingConfig tianXingConfig;
	
	@Override
        public String godReply() {
            TianXingResult tianXingResult = sendRequest(TxApiConstants.GOD_REPLY);
            if (!tianXingResult.isSuccess()) {
                return errorResult(tianXingResult);
            }

            TianXingGodReplyDetail godReplyDetail = JSONObject.parseObject(tianXingResult.getResult(), TianXingGodReplyDetail.class);
            return godReplyDetail.getTitle() + "\n" + godReplyDetail.getContent();
        }
	
	@Override
        public String itNews() {
            TianXingResult tianXingResult = sendRequest(TxApiConstants.NEWS_TYPE_IT, TxApiConstants.NEWS_NUM);
            return packageNewsResult(tianXingResult);
        }

        /**
        * 调用天行api
        */
        private TianXingResult sendRequest(String api, Object... params) {
            HttpClient httpClient = new HttpClient();
            // 构造api接口url及参数信息
            HttpMethod httpMethod = new GetMethod(tianXingConfig.getApiUrl() + String.format(api, params));
            try {
                log.info("send tianxing request api:{}, params:{}", api, params);
                int responseCode = httpClient.executeMethod(httpMethod);
                if (responseCode != 200) {
                    TianXingResult.error("" + responseCode, "http error!");
                }
                // 返回数据处理
                String responseBody = new String(httpMethod.getResponseBody());
                log.info("send tianxing response:{}", responseBody);
                TianXingResult tianXingResult = JSONObject.parseObject(responseBody, TianXingResult.class);
                return tianXingResult;
            }
            catch (IOException e) {
                log.error(api, e);
                return TianXingResult.error("error!");
            }
        }
	
        /**
        * 新闻接口数据包装
        */
	private String packageNewsResult(TianXingResult tianXingResult) {
            if (!tianXingResult.isSuccess()) {
                return errorResult(tianXingResult);
            }

            TianXingNewsPageResult tianXingPageResult = JSONObject.parseObject(tianXingResult.getResult(), TianXingNewsPageResult.class);
            StringBuilder sb = new StringBuilder();
            List<TianXingNewsDetail> newslist = tianXingPageResult.getNewslist();
            if (newslist == null) {
                newslist = tianXingPageResult.getList();
                if (newslist == null) {
                    return sb.toString();
                }
            }

            // 构造返回自己所需的数据结构
            for (int i = 1; i <= newslist.size(); i++) {
                TianXingNewsDetail tianXingNewsDetail = newslist.get(i - 1);
                sb.append(i + ".").append(tianXingNewsDetail.getTitle()).append("\n").append(tianXingNewsDetail.getUrl());
                if (i < newslist.size()) {
                    sb.append("\n");
                }
            }
            return sb.toString();
        }
	
        /**
        * 错误信息包装
        */
	private String errorResult(TianXingResult tianXingResult) {
            return String.format("%s-%s", tianXingResult.getCode(), tianXingResult.getMsg());
        }
}

接口测试

  • 可以引入spring-boot-starter-test包进行测试:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

引入@SpringBootTest注解,对接口进行单元测试:

@Slf4j
@SpringBootTest
class DailyRecommendApplicationTests {

    @Autowired
    private ITianXingService tianXingService;

    @Test
    void testTianXing() {
        log.info("testTianXing it news result:{}", tianXingService.itNews());
        log.info("testTianXing god reply result:{}", tianXingService.godReply());
    }
}

测试结果: image.png

  • 使用controller调用测试: 我们最初已经定义了controller入口,也可以根据controller入口使用postman工具进行直接调用获取结果,这里就不再做具体的演示。

备注

本文纯属娱乐使用,商业用途请谨慎遵循相应使用规范。

注:本文纯属个人喜好,无任何广告意图。