在單體項目中使用feign代替httpClient,調用接口
1、先導入feign依賴
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<springfox.version>2.5.0</springfox.version>
<httpcore>4.4.6</httpcore>
<fastjson.version>1.2.47</fastjson.version>
<spring-cloud.version>Greenwich.SR2</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-openfeign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-okhttp</artifactId>
<version>10.2.3</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
<!-- 修改後立即生效,熱部署 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
2、啓動類上加入EnableFeignClients註解
@SpringBootApplication @EnableFeignClients public class JcfwproApplication { public static void main(String[] args) { SpringApplication.run(JcfwproApplication.class, args); } }
3、配置feign配置項,使用okhttp來代替java的原生請求,請求頭中加入token驗證
import feign.Feign;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import lombok.extern.slf4j.Slf4j;
import okhttp3.ConnectionPool;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.cloud.openfeign.FeignAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.concurrent.TimeUnit;
@Configuration
@Slf4j
@ConditionalOnClass(Feign.class)
@AutoConfigureBefore(FeignAutoConfiguration.class)
public class FeignConfiguration implements RequestInterceptor {
@Override
public void apply(RequestTemplate requestTemplate) {
requestTemplate.header("token","eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJrc2JtIjoiIiwib3JnbmFtZSI6Iua1meaxn-ecgeWNq-eUn-WSjOiuoeWIkuWxgCIsIm9yZ2NvZGUiOiIwMDI0ODIzNjUzMzAxMDMxMVA5MTcxIiwiamdibSI6IjAwMjQ4MjM2NTMzMDEwMzExUDkxNzEiLCJ6eWdoIjoiIiwia3NtYyI6IiIsImV4cCI6MTYwNjgzMDgyNCwiemNsc2giOiI5MDA2MjdDQS04Q0IyLTRDRDItODg3Mi01OTZFNTlFREMyOEMiLCJ6eXhtIjoi6LaF57qn566h55CG5ZGYIiwiaWF0IjoxNjA2ODAyMDI0fQ.CZbsorhOL7qTA0slhAeprUzqwnmH5xSp4TIyXKa92as");
log.info("feign interceptor header:{}",requestTemplate);
}
@Bean
public okhttp3.OkHttpClient okHttpClient(){
return new okhttp3.OkHttpClient.Builder()
.readTimeout(60, TimeUnit.SECONDS)
.connectTimeout(60, TimeUnit.SECONDS)
.writeTimeout(120, TimeUnit.SECONDS)
.connectionPool(new ConnectionPool())
.build();
}
}
4、配置feignclient,分別包含get、post、以及webservice接口的調用
import com.winning.jcfwpro.config.FeignConfiguration;
import com.winning.jcfwpro.entity.ResponseEntity;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.*;
@FeignClient(value = "feignClientProxy",url = "${jcfwurl}",configuration = FeignConfiguration.class)
@Component
public interface FeignClientProxy {
/**
* 獲取系統菜單 get接口
* @param applicationId
* @return
*/
@GetMapping(value = "/v1.0/services/permissions/getGncd")
@ResponseBody
String getGncd(@RequestParam(value="applicationId") String applicationId);
/**
* 獲取token post接口
* @param param
* @return
*/
@PostMapping(value = "/v1.0/services/permissions/getToken", consumes = { MediaType.APPLICATION_JSON_VALUE })
@ResponseBody
ResponseEntity getToken(@RequestBody String param);
/**
* 個人信息註冊 webservice 接口
* @return
*/
@PostMapping(value = "/services/PlatformService", consumes = { MediaType.APPLICATION_XML_VALUE }, produces = MediaType.APPLICATION_XML_VALUE)
String patientRegister(@RequestBody String param);
}
5、配置controller,來完成調用
import com.alibaba.fastjson.JSON;
import com.winning.jcfwpro.entity.LoginDto;
import com.winning.jcfwpro.entity.ResponseEntity;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@RestController
@RequestMapping("/user")
@EnableSwagger2
@Api(description = "用戶接口")
public class SwaggerDemoController {
@Autowired
FeignClientProxy feignClientProxy;
@ApiOperation(value = "測試接口",notes="新增註冊")
@GetMapping(value = "/demo2")
public String getDemo() {
return ResponseEntity.error("新增成功.").toString();
}
/**
*獲取token
* @param loginDto
* @return
*/
@PostMapping(value = "/getToken")
@ResponseBody
public ResponseEntity getToken(@RequestBody LoginDto loginDto) {
return feignClientProxy.getToken(JSON.toJSONString(loginDto));
}
/**
* 功能菜單
* @param applicationId
* @return
*/
@RequestMapping(value = "/getGncd")
@ResponseBody
public String getGncd(@RequestParam(name = "applicationId") String applicationId){
return feignClientProxy.getGncd(applicationId);
}
/**
*
* @return
*/
@PostMapping(value = "/patientRegister")
String patientRegister(@RequestBody String param){
return feignClientProxy.patientRegister(param);
}
}