RuoYi接口开发
2024-06-20 11:55:20 # RuoYi # 接口开发

RuoYi添加接口

目录

Controller接口

首先我们添加接口需要在Controller的文件夹下面添加对应的Controller接口代码

这里我们以添加微博用户调度的接口为例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  /**
* 增加微博用户调度任务
*/
@PreAuthorize("@ss.hasPermi('crawler:weiboUser:schedule')")
@Log(title = "微博用户", businessType = BusinessType.INSERT)
@PostMapping("/scheduleTask") // 修改需要的路径
public AjaxResult scheduleTask(@RequestBody Map<String, Long> params) {
Long followerCount = params.get("followerCount");
Long interval = params.get("interval");
log.info("Received parameters: followerCount = " + followerCount + ", interval = " + interval);
if (followerCount == null || interval == null) {
return AjaxResult.error("Invalid parameters");
}
String result = weiboUserService.scheduleWeiboTask(followerCount, interval);
return AjaxResult.success(result);
}

代码详解

  • @PreAuthorize("@ss.hasPermi('crawler:weiboUser:schedule')")

    这里的代码是指定了具有指定权限的用户可以调用这个接口。这里既然指定了有权限的用户才能调用这个接口,也就说明我们在测试这个接口的时候需要先指定一个有权限的用户,需要拿取到用户的Token进行测试,并且调用这个接口的时候需要获取到用户信息才行

  • @Log(title = "微博用户", businessType = BusinessType.INSERT)

    这里的代码是一个自定义的注解,指定了这里的业务操作类型属于insert(插入操作)

  • @PostMapping("/scheduleTask")

    Post请求

  • AjaxResult
    这是SpringBoot常见的响应结构,标准化响应结构

添加对应的Service接口

这里在IWeiboUserService下添加

1
2
3
4
5
6
7
8
    /**
* 启动调度微博用户采集任务
*
* @param followerCount
* @param interval
* @return
*/
String scheduleWeiboTask(Long followerCount, Long interval);

在Servcie的业务层进行处理

WeiboUserServiceImpl.java

1
2
3
4
5
6
7
8
9
10
@Override
public String scheduleWeiboTask(Long followerCount, Long interval) {
DynamicDataSourceContextHolder.setDataSourceType("master"); // 切换到 MySQL 数据源
Map<String, Long> params = new HashMap<>();
params.put("followerCount", followerCount);
params.put("interval", interval);
int result = weiboUserMapper.insertWeiBoScheduleTask(params);
DynamicDataSourceContextHolder.clearDataSourceType();
return result > 0 ? "Task scheduled successfully" : "Failed to schedule task";
}

代码解析

DynamicDataSourceContextHolder.setDataSourceType("master");

这里我们是切换到了Mysql数据源,因为这个代码最上方指定了在Doris数据源@DataSource(value = DataSourceType.DORIS)而我们的表是在mysql内的

我们需要先去看一下当前的数据源配置,现在是使用Druid配置了多种数据源,查看application-druid.yml中的配置会发现我们配置了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
datasource:
type: com.alibaba.druid.pool.DruidDataSource
druid:
# 主库数据源
master:
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/bigdata-management-platform?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: root
# 从库数据源
slave:
# 从数据源开关/默认关闭
enabled: false
url:
username:
password:
# 采集任务数据源
doris:
driverClassName: com.mysql.cj.jdbc.Driver
enabled: true
url: jdbc:mysql://172.xx.xx.xxx:9030/default_cluster:task_center
username: root
password: xxxxx

于是在切换数据源的时候需要添加DynamicDataSourceContextHolder.setDataSourceType("mysql");

Mapper接口

1
int insertWeiBoScheduleTask(Long followerCount, Long interval);

调整安全认证(用于测试)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@Override
protected void configure(HttpSecurity httpSecurity) throws Exception {
// 注解标记允许匿名访问的url
ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry registry = httpSecurity.authorizeRequests();
permitAllUrl.getUrls().forEach(url -> registry.antMatchers(url).permitAll());

httpSecurity
.csrf().disable()
.headers().cacheControl().disable().and()
.exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
.authorizeRequests()
.antMatchers("/login", "/register", "/captchaImage").permitAll()
.antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll()
.antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll()
.antMatchers("/crawler/weiboUser/scheduleTask").permitAll() // 允许匿名访问该路径
.anyRequest().authenticated()
.and()
.headers().frameOptions().disable();

httpSecurity.logout().logoutUrl("/logout").logoutSuccessHandler(logoutSuccessHandler);
httpSecurity.addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);
httpSecurity.addFilterBefore(corsFilter, JwtAuthenticationTokenFilter.class);
httpSecurity.addFilterBefore(corsFilter, LogoutFilter.class);
}

代码详解

.antMatchers("/crawler/weiboUser/scheduleTask").permitAll() // 允许匿名访问该路径

这里主要是加上了一个允许匿名访问的路径,这里的路径需要与前面我们在Controller层设置的路径相同

更改MyBatis映射文件

这里主要的写入数据库的逻辑都写在了WeiboUserMapper.xml中,我们可以在这个文件中看到很多的插入写入的操作

1
2
3
4
5
<!-- 添加调度写入到调度数据库 -->
<insert id="insertWeiBoScheduleTask" parameterType="map">
INSERT INTO weibo_schedule_task (follower_count, interval)
VALUES (#{followerCount}, #{interval})
</insert>

获取token

获取登录Token的代码主要在SysLoginController.java文件中
我们只需要在登录的接口中加上打印出Token就好

1
2
3
4
5
6
7
8
9
10
11
@PostMapping("/login")
public AjaxResult login(@RequestBody LoginBody loginBody)
{
AjaxResult ajax = AjaxResult.success();
// 生成令牌
String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),
loginBody.getUuid());
ajax.put(Constants.TOKEN, token);
System.out.println("Token : "+token);
return ajax;
}

测试接口

这里官方提供了swagger-ui来进行测试接口,我们也可以选择postman的方式测试接口

这里我们会发现会返回响应是:

1
2
3
4
{
"msg": "Task scheduled successfully",
"code": 200
}

当出现这种标识的时候说明我们基本的添加接口开发已经成功,需要查看mysql表中是否有对应的数据

错误总结

Mybatis映射错误

如果我们发送请求测试后发现响应返回为:

{ "msg": "nested exception is org.apache.ibatis.binding.BindingException: Parameter 'followerCount' not found. Available parameters are [arg1, arg0, param1, param2]", "code": 500 }

看到这个响应标识说明我们的Mybatis映射出现错误,需要看一下前面步骤中有些地方可能没有对应上,再需要看一下表的结构与数据库中表的结构是否对应