Kotlin在使用WebClient调用uri(uri,Map)方法时,并不会拼接params,编译器也不会出错。具体是因为uri还有一个方法uri(uri, Object…),Kotlin特有的Map和java.util.Map并不一样。
解决方案:是用UriComponentsBuilder的queryParams(MultiValueMap)拼接好了再调用uri(URI)传入。
下面是啰嗦的:
发现的原因是webclient在编写使用动态代理模拟retrofit2风格的REST消费方式时,定义了一个RestHandler接口,webclient去实现时用uri(uri,Map)无法传递正确的参数。
/**
* 处理rest请求
*/
override fun invokeRest(methodInfo: MethodInfo): Any {
//构建Uri
val uri = UriComponentsBuilder
.fromUriString(serverInfo.url)
.path(methodInfo.uri)
.queryParams(methodInfo.params).build().encode().toUri()
val request = client
.method(methodInfo.method)
.uri(uri)
.accept(MediaType.APPLICATION_JSON)
//发出请求
val retrieve = methodInfo.body?.let {
request.body(it,methodInfo.bodyElementType).retrieve()
}?: request.retrieve()
//处理异常
retrieve.onStatus( {status -> status.value() == 404 }, { Mono.just(RuntimeException("not found"))})
//处理body
return if (methodInfo.isReturnFlux){
retrieve.bodyToFlux(methodInfo.returnElementType)
}else{
retrieve.bodyToMono(methodInfo.returnElementType)
}
}