springboot集成Feign調用第三方接口

springboot   2.1.7.RELEASE

feign的版本:

<spring-cloud.version>Greenwich.SR2</spring-cloud.version>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/io.github.openfeign/feign-okhttp -->
<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-okhttp</artifactId>
    <version>10.2.3</version>
</dependency>

 

使用時,配置config類

package com.young.springdemo.config;

import feign.Feign;
import okhttp3.ConnectionPool;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Bean;
import org.springframework.cloud.openfeign.FeignAutoConfiguration;
import org.springframework.context.annotation.Configuration;

import java.util.concurrent.TimeUnit;

@Configuration
@ConditionalOnClass(Feign.class)
@AutoConfigureBefore(FeignAutoConfiguration.class)
public class FeignConfig {

    @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();
    }
}

springapplication主類上添加註解

@EnableFeignClients

 

編寫feign調用接口

@FeignClient(name = "feignSerive", url = "192.168.100.52:16010/myapi")
public interface FeignService {

url可以配置文件編寫;

 

接口形式爲下面:

    @RequestMapping(value = "/test", method = RequestMethod.GET)
    @ResponseBody
    ResponseData<String> invoke();
  @Component
    class DefaultFallback implements FeignService {
        @Override
        public ResponseData<String> invoke() {
            throw new RuntimeException();
//            return new ResponseData<String>().setCode("40004").setDesc("服務異常").setData(null);
        }

調用時,直接在controller中,注入該接口,此時,還需要實現該接口,拋出異常處理.可以內部類,可以外部都可以..

 

再看下192.168.100.52:16010/myapi/test 對應的接口,

    @RequestMapping(value = "test",method = RequestMethod.GET)
    public  void getTest(){
        System.out.println("無參GET方法,調用成功");
        return;
    }

很簡單,只是暴露簡單的業務來執行.

 

東西不多,坑很多,要調用的類型也很多,所以將所有的代碼貼出來,大家參考就行,我也是參考別人的....

兩個通用實體類

package com.young.springdemo.utils.domain;

public class ResponseData<T> {

    private String code;
    private String desc;
    private T data;

    public String getCode() {
        return code;
    }

    public ResponseData<T> setCode(String code) {
        this.code = code;
        return this;
    }

    public String getDesc() {
        return desc;
    }

    public ResponseData<T> setDesc(String desc) {
        this.desc = desc;
        return this;
    }

    public T getData() {
        return data;
    }

    public ResponseData<T> setData(T data) {
        this.data = data;
        return this;
    }
}
package com.young.springdemo.utils.domain;


public class DemoResp {

    private String name;
    private String age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }
}

 

外部被調用接口實現:

package com.young.springdemo.utils.domain;


import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping(value = "myapi")
@ResponseBody
public class TestController {

    @RequestMapping(value = "test",method = RequestMethod.GET)
    public  void getTest(){
        System.out.println("無參GET方法,調用成功");
        return;
    }

    @RequestMapping(value = "getParam",method = RequestMethod.GET)
    @ResponseBody
    public String getParam(@RequestParam String name,@RequestParam String age) {
        System.out.println("有參GET,獲取到的參數name位:" + name+"==== age:"+age);
        return name;
    }

    @RequestMapping(value = "getPost",method = RequestMethod.POST)
    @ResponseBody
    public String getPost(){
        System.out.println("調用無參post成功");
        return "SUCCESS";
    }

    @RequestMapping(value = "getPostParam",method = RequestMethod.POST)
    @ResponseBody
    public String getPostParam(@RequestParam("name")String name){
        System.out.println("調用有參成功,name:"+name);
        DemoResp demoResp = new DemoResp();
        demoResp.setName(name);
        return name;
    }

    @RequestMapping(value = "getPostResult",method = RequestMethod.POST)
    @ResponseBody
    public ResponseData getPostResult(){
        System.out.println("調用無參post成功");
        return new ResponseData<DemoResp>().setCode("200");
    }

    @RequestMapping(value = "getPostParamResult",method = RequestMethod.POST)
    @ResponseBody
    public ResponseData<DemoResp> getPostParamResult(@RequestParam("name")String name){
        System.out.println("調用有參成功,name:"+name);
        DemoResp demoResp = new DemoResp();
        demoResp.setName(name);
        return new ResponseData<DemoResp>().setCode("200").setData(demoResp);
    }


    @RequestMapping(value = "getPostParamEntityResult",method = RequestMethod.POST)
    @ResponseBody
    public ResponseData<DemoResp> getPostParamResult(@RequestBody DemoResp resParam){
        System.out.println("調用有參成功,name:"+resParam.toString());
        return new ResponseData<DemoResp>().setCode("200").setData(resParam);
    }
}

 

內部feign接口調用

package com.young.springdemo.service.feign;


import com.sun.org.apache.regexp.internal.RE;
import com.young.springdemo.utils.DemoResp;
import com.young.springdemo.utils.ResponseData;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.*;

@FeignClient(name = "feignSerive", url = "192.168.100.52:16010/myapi")
public interface FeignService {

    @RequestMapping(value = "/test", method = RequestMethod.GET)
    @ResponseBody
    ResponseData<String> invoke();

    @RequestMapping(value = "getParam",method = RequestMethod.GET)
    String getParam(@RequestParam(value = "name") String name,@RequestParam(value = "age")String age);

    @RequestMapping(value = "getPost",method = RequestMethod.POST)
    String getPost();

    @RequestMapping(value = "getPostParam",method = RequestMethod.POST)
    String getPostParam(@RequestParam(value = "name")String name);

    @RequestMapping(value = "getPostResult",method = RequestMethod.POST)
    ResponseData<DemoResp> getPostResult();

    @RequestMapping(value = "getPostParamResult",method = RequestMethod.POST)
    ResponseData<DemoResp> getPostParamResult(@RequestParam(value = "name")String name);

    @RequestMapping(value = "getPostParamEntityResult",method = RequestMethod.POST)
    ResponseData<DemoResp> getPostParamEntityResult(@RequestBody DemoResp resp);



    @Component
    class DefaultFallback implements FeignService {
        @Override
        public ResponseData<String> invoke() {
            throw new RuntimeException();
//            return new ResponseData<String>().setCode("40004").setDesc("服務異常").setData(null);
        }

        @Override
        public String getParam(String name,String age) {
            throw new RuntimeException();
        }

        @Override
        public String getPost() {
            throw new RuntimeException();
        }

        @Override
        public String getPostParam(String name) {
            throw new RuntimeException();
        }

        @Override
        public ResponseData<DemoResp> getPostResult() {
            throw new RuntimeException();
        }

        @Override
        public ResponseData<DemoResp> getPostParamResult(String name) {
            throw new RuntimeException();
        }

        @Override
        public ResponseData<DemoResp> getPostParamEntityResult(DemoResp resp) {

            throw new RuntimeException();
        }
    }
}

 

自身調用接口

package com.young.springdemo.controller;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.young.springdemo.AsyncService.StudentServiceAsync;
import com.young.springdemo.service.feign.FeignService;
import com.young.springdemo.utils.DemoResp;
import com.young.springdemo.utils.ResponseData;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.web.bind.annotation.*;

import java.io.*;

@RestController
@RequestMapping("/myapi")
public class StudentController {
    private final static Logger logger = LoggerFactory.getLogger(StudentController.class);

    @Autowired
    private StudentServiceAsync studentServiceAsync;



    @RequestMapping(value = "getStu", method = RequestMethod.GET)
    @ResponseBody
    public void getStudent() {
        logger.info("開始執行接口");
        for (int i = 0; i < 5; i++) {
            studentServiceAsync.getStudent();
            studentServiceAsync.getStu();
        }
        logger.info("結束執行接口");
    }

    @RequestMapping(value = "testPy", method = RequestMethod.GET)
    @ResponseBody
    public void testPy() {

    }

    public static void main(String[] args) {
        String line;
        try {
            //創建讀取python的必要條件.
            // 數組1:必須是"python",指定文件格式
            //數組2:該python的文件的路徑,可以是絕對路徑,也可以是相對路徑
            //數組3及以後:是對python調用的方式的傳遞參數的方式
            String[] params = new String[]
                    {"python", "D:\\py\\project\\hello_py.py", "小明", "20"};
            //給調用python分配一個進程,並執行py文件
            Process process = Runtime.getRuntime().exec(params); //執行py文件
            //讀取python寫的數據
            BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream(), "GBK"));
            while ((line = in.readLine()) != null) {
                //todo 輸出處理python傳輸數據
                System.out.println(line);
            }
            in.close();//關閉字節流
            //java代碼中的process.waitFor()返回值爲0表示我們調用python腳本成功,
            //返回值爲1表示調用python腳本失敗
            int re = process.waitFor();//0:執行成功;1:執行失敗;2:調用失敗
            switch (re) {
                case 0:
                    //todo :執行成功
                    System.out.println("調用python,執行成功");
                    break;
                case 1:
                    //todo :執行失敗
                    System.out.println("調用python,執行失敗");
                    break;
                case 2:
                    //todo: 調用失敗
                    System.out.println("調用python文件失敗");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    //測試Feign


    @Autowired
    private FeignService feignClientProxy;

    @RequestMapping(value = "test")
    @ResponseBody
    public String testFeign(@RequestParam(name = "name") String name) throws JsonProcessingException {
        ObjectMapper objectMapper = new ObjectMapper();
        System.out.println("開始執行");
        ResponseData<String> respResponseBody = feignClientProxy.invoke();
        System.out.println("執行結束");
        return "調用結果:"+ objectMapper.writeValueAsString(respResponseBody);
    }

    @RequestMapping(value = "getParam",method =RequestMethod.GET)
    @ResponseBody
    public String getParam(@RequestParam(name = "name") String name) throws JsonProcessingException {
        ObjectMapper objectMapper = new ObjectMapper();
        System.out.println("開始執行");
        String obj = feignClientProxy.getParam(name,"12");
        System.out.println("執行結束");
        return "調用結果:"+ objectMapper.writeValueAsString(obj.toString());
    }

    @RequestMapping(value = "getPost",method =RequestMethod.POST)
    @ResponseBody
    public String getPost() throws JsonProcessingException {
        ObjectMapper objectMapper = new ObjectMapper();
        System.out.println("開始執行");
        String obj = feignClientProxy.getPost();
        System.out.println("執行結束");
        return "調用結果:"+ objectMapper.writeValueAsString(obj.toString());
    }

    @RequestMapping(value = "getPostParam",method =RequestMethod.POST)
    @ResponseBody
    public String getPostParam(@RequestParam(name = "name") String name) throws JsonProcessingException {
        ObjectMapper objectMapper = new ObjectMapper();
        System.out.println("開始執行");
        String obj = feignClientProxy.getPostParam(name);
        System.out.println("執行結束");
        return "調用結果:"+ objectMapper.writeValueAsString(obj.toString());
    }


    @RequestMapping(value = "getPostParamResult",method =RequestMethod.POST)
    @ResponseBody
    public String getPostParamResult(@RequestParam(name = "name") String name) throws JsonProcessingException {
        ObjectMapper objectMapper = new ObjectMapper();
        ResponseData<DemoResp> postParamResult = feignClientProxy.getPostParamResult(name);

        System.out.println("執行結束,"+postParamResult.toString());
        return "調用結果:"+ objectMapper.writeValueAsString(postParamResult.toString());
    }

    @RequestMapping(value = "getPostResult",method =RequestMethod.POST)
    @ResponseBody
    public String getPostResult(@RequestParam(name = "name") String name) throws JsonProcessingException {
        ObjectMapper objectMapper = new ObjectMapper();
        System.out.println("開始執行");
        ResponseData<DemoResp> postParamResult = feignClientProxy.getPostResult();
        System.out.println("執行結束,"+postParamResult.toString());
        return "調用結果:"+ objectMapper.writeValueAsString(postParamResult.toString());
    }

    @RequestMapping(value = "getPostParamEntityResult",method =RequestMethod.POST)
    @ResponseBody
    public ResponseData getPostParamEntityResult(@RequestParam(name = "name") String name) throws JsonProcessingException {
        ObjectMapper objectMapper = new ObjectMapper();
        DemoResp demoResp = new DemoResp();
        demoResp.setName(name);
        ResponseData<DemoResp> postParamResult = feignClientProxy.getPostParamEntityResult(demoResp);
        return postParamResult;
//        System.out.println("執行結束,"+postParamResult.toString());
//        return "調用結果:"+ objectMapper.writeValueAsString(postParamResult.toString());
    }

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章