1.问题.
第三方服务接口如下:
@GetMapping("/courses_teachers")
List<Course> getStudentCoursesAndTeachers(@RequestHeader String username)
因为第三方服务使用的OAuth2身份认证,所以除了username参数外,还需要请求头携带Authorization.
如果在controller里,使用Feign调用时会自动把HttpServletRequest的请求头信息加入进来.
Feign接口:
@GetMapping("/courses_teachers")
List<Course> getStudentCoursesAndTeachers(String username);
controller:
courseList = courseService.getStudentCoursesAndTeachers(username);
controller里feign调用时会携带前端的请求头,包括了Authorization,所以能够正常取得返回值;
而非controller的netty handler进行feign调用,报错[401] during [GET] to xxx,[{"error": "unauthorized" , "error_ description": "FULL authentication is required to access this resource"}],由于feign接口的参数没有Authorization,所以netty handler无法通过第三方的身份认证.
2.方法.
采用编程式远程调用,使用RestTemplate.
先配置RestTemplate:
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;
@Configuration
public class RestTemplateConfig {
@Bean
public RestTemplate restTemplate(@Qualifier("simpleClientHttpRequestFactory") ClientHttpRequestFactory factory){
return new RestTemplate(factory);
}
@Bean
public ClientHttpRequestFactory simpleClientHttpRequestFactory(){
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
//设置连接超时
factory.setConnectTimeout(15000);
factory.setReadTimeout(5000);
return factory;
}
}
在 netty handler里:
//前端发来的socket消息里的token
String token = message.getToken();
//取得Spring IOC 容器里的restTemplate
ApplicationContext applicationContext = SpringContextUtil.getApplicationContext();
RestTemplate restTemplate = applicationContext.getBean(RestTemplate.class);
HttpHeaders headers = new HttpHeaders();
headers.add("Authorization", token);
ResponseEntity<List> response = restTemplate.exchange(
"第三方服务接口url",
HttpMethod.GET,
new HttpEntity<String>(headers),
List.class
);
List<LinkedHashMap> courseList = response.getBody();