1. feign、http,有时候在调用第三方api的时候、使用httpclient,别人的接口不可能提供它的配置,自己项目框架是spring的,使用feign相互配置,都是okhttpclient的方式。Feign是一个接口声明式调用框架,实现了一个抽象层的逻辑,没有真正实现底层http请求,提供了一个client接口用于实现底层http操作,默认提供的实现是基于httpurlconnection,也有基于apachehttpclient的实现,且feign具有分布式负载均衡功能
  2. feign的两种使用方法
    1. 在请求方法上添加请求头参数
      1. @FeignClient(name=”apiClient”,url=”${test.url}”,path=”api”)
      2. Public interface BasicApiClient{
      3.  
      4. @getMapping
      5. void queryUser(@requestHeader(name=“token”)String token)
      6. }
      7. 注意多了一个header,相当于往请求头添加了一个token参数,适用于token动态变化的参数
    2. 利用@FeignClient的configuration属性
      1. Public class ClientConfiguration{
      2. @value(“${test.token}”)
      3. Private String token;
      4. @bean
      5. Public requestInterceptor headerInterceptor(){
      6. Retrun new requestInterceptor(){
      7. @overide
      8. Public void apply(requrestTemplate template){
      9.    List<String> authorizationList=Lists.newArrayList(token);
      10.    List<String> contentTypeList = Lists.newArrayList("application/x-www-form-urlencoded;charset=utf-8");
      11.    Map<String, Collection<String>> headers = ImmutableMap.of("token", authorizationList, "Content-Type", contentTypeList);
      12.    template.headers(headers);
      13.  
      14. }
      15. }
      16. }
      17. 修改@feignClient
      • xviii.   @FeignClient(name = "apiClientTwo", url = "${test.url}", path = "api", configuration = ClientConfiguration.class)
  1. Feign原理实现

结构图

启动配置上检查是否有enablefeignclients注解,如果有,开启包扫描,扫描feignclient接口,扫描到后通过beandefinition注入到ioc容器中,方便被调用。

在feignclientsregister中,registerfeignclient完成了注册feign客户端的操作,包括注解时配置的所有信息。

Reflectivefeign内部使用了jdk动态代理为目标接口生成动态代理类,生成了一个invocationhandler的统一方法拦截器,同时为接口的每个方法生成一个synchronousmethodhandler拦截器,并解析方法上的元数据,通过requestTemplate生成一个http请求模板

始化扫包原理:

  Feignclientfactorybean解析

代理实现

 

代理invoke的实际执行过程

  1. Httpclient原理:使用httpclient包
    1. 创建httpclient对象
    2. 创建request对象
    3. 使用httpclient执行request,得到response
    4. 处理response,关闭httpclient
    5. public void test01(){
    6.         HttpClient httpClient = HttpClients.createDefault();
    7.         String url = "https://www.cctv.com";
    8.         HttpGet get = new HttpGet(url);
    9.         try {
    10.             HttpResponse httpResponse = httpClient.execute(get);
    11.             //获取返回值状态信息
    12.             int status = httpResponse.getStatusLine().getStatusCode();
    13.             if(status == 200){
    14.                 //请求正确的.  获取响应结果
    15.                 HttpEntity entity = httpResponse.getEntity(); //获取响应对象的实体信息.
    16.                 //将实体对象转化为用户能够识别的字符串
    17.                 String result = EntityUtils.toString(entity,"UTF-8");
    18.                 System.out.println(result);
    19.             }else{
    20.                 System.out.println("httpClient调用异常.");
    21.             }
    22.         } catch (IOException e) {
    23.             e.printStackTrace();
    24.         }
    25.     }
  2. 使用httpclient解决的跨域问题:
    1. Ajax请求地址改为自己系统的后台地址,之后在自己后台用httpclient请求url
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐