学习基于记录,而不止于记录。
希望自己能坚持下去~
0.写在前面
又咕了好久啊,学如逆水行舟,不进则退。接好久之前的一篇散记Eureka服务间feign请求_2020.06.23。
1.问题
之前曾经吐槽restTemplate请求,代码不够优雅,feign请求则更为规整,但是用着用着我就发现不对劲了,restTemplate可以将目标接口url作为参数请求,很容易就实现了动态接口请求,这对于feign来说可就费劲了,但是也有实现的方式。
2.feign的动态url请求
为了方便减少篇幅和不必要的废话,直接上代码(包含GET和POST两种请求)
2.1 接口编写
import com.wishoffice.platform.model.other.OperationResponse;
import com.wishoffice.platform.security.FeignHeaderInterceptor;
import feign.HeaderMap;
import feign.Param;
import feign.QueryMap;
import feign.RequestLine;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import javax.servlet.http.HttpServletRequest;
import java.net.URI;
import java.util.Map;
@FeignClient(name = "wishClient")
public interface WishFeignClient {
@RequestLine("GET /totalStartProcess?processDefinitionId={processDefinitionId}&czdh={czdh}")
OperationResponse totalStartProcess(
URI uri,
@HeaderMap Map<String, Object> headerMap,
@Param("processDefinitionId") String processDefinitionId,
@Param("czdh") String czdh);
@RequestLine("POST /services/sms/send")
String sendSM(
URI uri,
@HeaderMap Map<String, Object> headerMap,
@QueryMap Map<String, Object> bodyMap);
}
2.2 service包装类编写
import com.wishoffice.platform.model.other.OperationResponse;
import feign.Feign;
import feign.Target;
import feign.codec.Decoder;
import feign.codec.Encoder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.openfeign.FeignClientsConfiguration;
import org.springframework.context.annotation.Import;
import org.springframework.stereotype.Component;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Map;
@Component
@Import(value = {FeignClientsConfiguration.class})
public class CallerService {
private WishFeignClient wishFeignClient;
@Autowired
public CallerService(Decoder decoder, Encoder encoder) {
wishFeignClient = Feign.builder()
.encoder(encoder)
.decoder(decoder)
.target(Target.EmptyTarget.create(WishFeignClient.class));
}
public OperationResponse call(String url, Map<String, Object> headerMap, String processDefinitionId, String czdh) throws URISyntaxException {
System.out.println("url:" + url);
System.out.println("headerMap:" + headerMap);
System.out.println("processDefinitionId:" + processDefinitionId);
System.out.println("czdh:" + czdh);
return wishFeignClient.totalStartProcess(new URI(url), headerMap, processDefinitionId, czdh);
}
public String sendSM(String url, Map<String, Object> headerMap, Map<String, Object> bodyMap) throws URISyntaxException {
System.out.println("headerMap:" + headerMap);
System.out.println("bodyMap:" + bodyMap);
return wishFeignClient.sendSM(new URI(url), headerMap, bodyMap);
}
}
2.3 根据业务需要入参调用
GET
ProcessModel processModel = this.findByProcessDefinitionId(processDefinitionId);
Map<String, Object> headerMap = new HashMap<>();
headerMap.put(TokenUtil.AUTH_HEADER_NAME, TokenUtil.getToken(request));
return callerService.call(processModel.getStartProcessUrl(),headerMap, processDefinitionId, czdh);
POST
Map<String, Object> headerMap = new HashMap<>();
headerMap.put("Content-Type", "application/json;charset=utf-8");
Map<String, Object> bodyMap = new HashMap<>();
bodyMap.put("mobileNo", telNo);
bodyMap.put("content", content);
bodyMap.put("msgType", "1");
bodyMap.put("verifyCode", String.valueOf(mobile_code));
System.out.println("短信验证码开始请求...");
String result = callerService.sendSM("http://172.16.90.85:10086", headerMap, bodyMap);
System.out.println("短信验证码返回值:" + result);
3. 总结
从上面来看,feign的动态url请求还是比较麻烦的,这一点也不知道后续版本更新有无优化的方案。