Spring Boot Kotlin中携带Payload调用第三方POST接口并返回baseSize
Spring Boot Kotlin调用第三方API并提取指定字段实现方案
1. 添加依赖
在build.gradle.kts中引入WebFlux依赖(WebClient是Spring WebFlux的组件,适合非阻塞HTTP调用):
dependencies { implementation("org.springframework.boot:spring-boot-starter-webflux") implementation("com.fasterxml.jackson.module:jackson-module-kotlin") // 用于Kotlin数据类的JSON序列化/反序列化 }
2. 定义请求/响应数据类
用Kotlin数据类映射请求Payload和响应结构,响应类可忽略不需要的字段:
// 请求Payload对应的数据类 data class SubscriptionQueryRequest( val applicationId: String, val password: String ) // 响应数据类,忽略未知字段仅保留需要的baseSize @JsonIgnoreProperties(ignoreUnknown = true) data class SubscriptionQueryResponse( val baseSize: String )
3. 配置WebClient Bean
在配置类中创建WebClient实例,方便全局注入使用:
import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration import org.springframework.web.reactive.function.client.WebClient @Configuration class WebClientConfig { @Bean fun thirdPartyApiWebClient(): WebClient { return WebClient.builder() .baseUrl("https://api.example.com.bd") // 第三方API基础地址 .defaultHeader("Content-Type", "application/json;charset=utf-8") .build() } }
4. 编写API调用服务类
创建服务类封装调用逻辑,发送POST请求并提取baseSize字段:
import org.springframework.stereotype.Service import org.springframework.web.reactive.function.client.WebClient import reactor.core.publisher.Mono @Service class SubscriptionService( private val thirdPartyApiWebClient: WebClient ) { fun getBaseSize(applicationId: String, password: String): Mono<String> { val request = SubscriptionQueryRequest(applicationId, password) return thirdPartyApiWebClient.post() .uri("/subscription/query-base") // 接口路径 .bodyValue(request) .retrieve() .bodyToMono(SubscriptionQueryResponse::class.java) .map { it.baseSize } // 提取目标字段 .onErrorResume { ex -> // 自定义异常处理逻辑,可根据业务调整 Mono.error(RuntimeException("调用第三方API失败: ${ex.message}")) } } }
5. 可选:对外暴露接口(控制器)
如果需要通过自身服务的接口对外提供该功能,可以编写Controller:
import org.springframework.web.bind.annotation.PostMapping import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.RestController import reactor.core.publisher.Mono @RestController class SubscriptionController( private val subscriptionService: SubscriptionService ) { @PostMapping("/get-base-size") fun getBaseSize(@RequestBody request: SubscriptionQueryRequest): Mono<String> { return subscriptionService.getBaseSize(request.applicationId, request.password) } }
补充说明
- 若偏好阻塞式调用,也可使用
RestTemplate(Spring Boot 3.x中RestTemplate已标记为维护状态,优先推荐WebClient)。 - 异常处理、参数校验等逻辑可根据实际业务需求扩展。
内容的提问来源于stack exchange,提问作者Sajith dilshan
相关产品推荐
相关产品推荐

