OpenFeign调用第三方HTTP服务

admin 44 0

OpenFeign/Feign是什么?

Feign是受RetrofitJAXRS-2.0WebSocket启发的Java到HTTP客户端绑定程序Feign的第一个目标是减少对ReSTfulness的依赖,并且可以使得微服务、第三方HTTP的API接口在Spring中风格统一的服务框架。

Github地址:https://github.com/OpenFeign/feign/

Feign是如何工作的?

Feign通过将注释处理为模板化请求来工作。在输出之前,参数以简单的方式应用于这些模板。尽管Feign仅限于支持基于文本的API,但它极大地简化了系统方面,例如重播请求。此外,Feign知道这一点后,就可以轻松对转换进行单元测试。


Feign的兼容性?

Feign 10.x及更高版本基于Java 8构建,并且应可在Java 9、10和11上运行。对于那些需要JDK 6兼容性的应用程序,请使用Feign9.x。


调用三步:加依赖、写配置、写代码

加依赖

在pom.xml里加入:

 <!--添加feign依赖-->
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-feign</artifactId>
    </dependency>


写配置

在Application里 加入

@EnableFeignClients

如下代码所示:

package cc.coolplay51.fakashop3;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableAsync
@EnableScheduling
@EnableCaching
@EnableFeignClients
public class Fakashop3Application {

    public static void main(String[] args) {
        SpringApplication.run(Fakashop3Application.class, args);
    }

}

写代码(第三方HTTP接口示例)

package cc.coolplay51.fakashop3.Service;

import cc.coolplay51.fakashop3.DO.Order;
import cc.coolplay51.fakashop3.DTO.OrderInfo;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.GetMapping;

/**
 * @Classname PayService
 * @Description 支付宝订单支付类
 * @Date 2021/5/1 1:53
 * @Created by JiGuang
 */
@Service
@FeignClient(url = "xxx",name = "Pay")
public interface PayService {

    @GetMapping("/createOrder.php")
    /**
     * 发起一个支付,返回创建订单的基础信息
     */
    public OrderInfo createOrder(String subject, Float total, String body);
}

调用同普通Service一样调用即可,与Spring生态完美配合,还是熟悉的MVC用法。


常用注解与简单介绍


注解接口适用用途
@RequestLine方法为请求定义HTTP方法和URLTemplate。表达式是 {expression} 的格式,并且可以和@Param注解一起使用。
@Param参数定义一个模板变量。它的值将会通过name属性被用于模板表达式的解析中。如果被省略,将会尝试从参数名中读取。
@Headers方法,类型定义一个HeaderTemplate一个UriTemplate的变量,使用 @Param注解去适应Expressions表达式。使用在类型上,将会生效在每一个请求上。当在方法上注解时,将只会对注解生效。
@QueryMap参数定义键值对的Map,或者Java对象,扩展请求的字符串信息。
@HeaderMap参数定义键值对的Map,扩展HTTP请求头。
@Body方法

定义一个模板,类似于URLTempalate和HaedTemplate,使用@Param注解相适应的表达式。


Feign发起表单POST请求

加配置

/**
 * @Classname FeignConfig
 * @Description TODO
 * @Date 2021/5/1 1:43
 * @Created by HanYuHao
 */
@Configuration
public class FeignConfig {

    @Autowired
    private ObjectFactory<HttpMessageConverters> messageConverters;

    //Feign表单提交配置
    @Bean
    @Primary
    @Scope(BeanDefinition.SCOPE_PROTOTYPE)
    Encoder formEncoder() {
        return new FormEncoder(new SpringEncoder(this.messageConverters));
    }
}

写代码

/**
 * @Classname QQAuthService
 * @Description QQ认证授权类
 * @Date 2021/5/1 0:55
 * @Created by JiGuang
 */
@Service
@FeignClient(url = "xxx",name = "QQAuth")
public interface QQAuthService {
    @GetMapping()
    /**
     * 获取二维码及其签名
     */
    public QRInfo getQRInfo();

    @PostMapping(value = "/",consumes = {"application/x-www-form-urlencoded"})
    /**
     * 获取扫描状态
     */
    public QQKey getResult(Map<String, ?> formParams);
}

对应方法的value不能为空,不然会报错,别忘了加

consumes = {"application/x-www-form-urlencoded"}

传值时候,传入Map即可请求成功。

发表评论 (已有0条评论)

还木有评论哦,快来抢沙发吧~