feign-form基本使用
此模块添加了对编码 application/x-www-form-urlencoded 和 multipart/form-data 表单的支持。
1、添加依赖
包含对您的应用程序的依赖项:
1.1、Maven:
<dependencies>
...
<dependency>
<groupId>io.github.openfeign.form</groupId>
<artifactId>feign-form</artifactId>
<version>3.8.0</version>
</dependency>
...
</dependencies>
1.2、Gradle:
compile 'io.github.openfeign.form:feign-form:3.8.0'
2、要求
feign-form 扩展依赖于 OpenFeign 及其具体版本:
- 3.5.0 之前的所有 feign-form 版本都适用于 OpenFeign 9.* 版本;
- 从 feign-form 的 3.5.0 版开始,该模块适用于 OpenFeign 10.1.0 及更高版本。
重要提示:没有向后兼容性,也没有任何保证 3.5.0 之后的 feign-form 版本与 10.* 之前的 OpenFeign 一起使用。 OpenFeign 在第 10 个版本中被重构,所以最好的方法 – 使用最新的 OpenFeign 和 feign-form 版本。
注意:
- spring-cloud-openfeign 在 v2.0.3.RELEASE 之前使用 OpenFeign 9.,之后使用 10.。反正这个依赖已经有合适的feign-form版本了,看依赖pom,不需要单独指定;
- spring-cloud-starter-feign 是一个已弃用的依赖项,它始终使用 OpenFeign 的 9.* 版本。
3、用法
像这样将 FormEncoder 添加到 Feign.Builder 中:
SomeApi github = Feign.builder()
.encoder(new FormEncoder())
.target(SomeApi.class, "http://api.some.org");
此外,您可以像这样装饰现有的编码器,例如 JsonEncoder:
SomeApi github = Feign.builder()
.encoder(new FormEncoder(new JacksonEncoder()))
.target(SomeApi.class, "http://api.some.org");
并一起使用它们:
interface SomeApi {
@RequestLine("POST /json")
@Headers("Content-Type: application/json")
void json (Dto dto);
@RequestLine("POST /form")
@Headers("Content-Type: application/x-www-form-urlencoded")
void from (@Param("field1") String field1, @Param("field2") String[] values);
}
您可以通过 Content-Type 标头指定两种类型的编码形式。
application/x-www-form-urlencoded
interface SomeApi {
@RequestLine("POST /authorization")
@Headers("Content-Type: application/x-www-form-urlencoded")
void authorization (@Param("email") String email, @Param("password") String password);
// Group all parameters within a POJO
@RequestLine("POST /user")
@Headers("Content-Type: application/x-www-form-urlencoded")
void addUser (User user);
class User {
Integer id;
String name;
}
}
multipart/form-data
interface SomeApi {
// File parameter
@RequestLine("POST /send_photo")
@Headers("Content-Type: multipart/form-data")
void sendPhoto (@Param("is_public") Boolean isPublic, @Param("photo") File photo);
// byte[] parameter
@RequestLine("POST /send_photo")
@Headers("Content-Type: multipart/form-data")
void sendPhoto (@Param("is_public") Boolean isPublic, @Param("photo") byte[] photo);
// FormData parameter
@RequestLine("POST /send_photo")
@Headers("Content-Type: multipart/form-data")
void sendPhoto (@Param("is_public") Boolean isPublic, @Param("photo") FormData photo);
// Group all parameters within a POJO
@RequestLine("POST /send_photo")
@Headers("Content-Type: multipart/form-data")
void sendPhoto (MyPojo pojo);
class MyPojo {
@FormProperty("is_public")
Boolean isPublic;
File photo;
}
}
在上面的示例中,sendPhoto 方法使用 photo 参数使用三种不同的受支持类型。
- File 将使用 File 的扩展名来检测 Content-Type;
- byte[] 将使用 application/octet-stream 作为 Content-Type;
- FormData 将使用 FormData 的 Content-Type 和 fileName;
- 用于分组参数(包括上述类型)的客户端自定义 POJO。
FormData 是一个自定义对象,它包装了一个 byte[] 并定义了一个 Content-Type 和 fileName,如下所示:
FormData formData = new FormData("image/png", "filename.png", myDataAsByteArray);
someApi.sendPhoto(true, formData);
4、Spring MultipartFile 和 Spring Cloud Netflix @FeignClient 支持
您还可以将表单编码器与 Spring MultipartFile 和 @FeignClient 一起使用。 将依赖项包含到项目的 pom.xml 文件中:
<dependencies>
<dependency>
<groupId>io.github.openfeign.form</groupId>
<artifactId>feign-form</artifactId>
<version>3.8.0</version>
</dependency>
<dependency>
<groupId>io.github.openfeign.form</groupId>
<artifactId>feign-form-spring</artifactId>
<version>3.8.0</version>
</dependency>
</dependencies>
@FeignClient( name = "file-upload-service", configuration = FileUploadServiceClient.MultipartSupportConfig.class )
public interface FileUploadServiceClient extends IFileUploadServiceClient {
public class MultipartSupportConfig {
@Autowired
private ObjectFactory<HttpMessageConverters> messageConverters;
@Bean
public Encoder feignFormEncoder () {
return new SpringFormEncoder(new SpringEncoder(messageConverters));
}
}
}
或者,如果您不需要 Spring 的标准编码器:
@FeignClient( name = "file-upload-service", configuration = FileUploadServiceClient.MultipartSupportConfig.class )
public interface FileUploadServiceClient extends IFileUploadServiceClient {
public class MultipartSupportConfig {
@Bean
public Encoder feignFormEncoder () {
return new SpringFormEncoder();
}
}
}
感谢 tf-haotri-pham 的特性,它利用了 Apache commons-fileupload 库,处理多部分响应的解析。正文数据部分作为字节数组保存在内存中。 要使用此功能,请在解码器的消息转换器列表中包含 SpringManyMultipartFilesReader,并让 Feign 客户端返回一个 MultipartFile 数组:
@FeignClient( name = "${feign.name}", url = "${feign.url}" configuration = DownloadClient.ClientConfiguration.class )
public interface DownloadClient {
@RequestMapping("/multipart/download/{fileId}")
MultipartFile[] download(@PathVariable("fileId") String fileId);
class ClientConfiguration {
@Autowired
private ObjectFactory<HttpMessageConverters> messageConverters;
@Bean
public Decoder feignDecoder () {
List<HttpMessageConverter<?>> springConverters =
messageConverters.getObject().getConverters();
List<HttpMessageConverter<?>> decoderConverters =
new ArrayList<HttpMessageConverter<?>>(springConverters.size() + 1);
decoderConverters.addAll(springConverters);
decoderConverters.add(new SpringManyMultipartFilesReader(4096));
HttpMessageConverters httpMessageConverters = new HttpMessageConverters(decoderConverters);
return new SpringDecoder(new ObjectFactory<HttpMessageConverters>() {
@Override
public HttpMessageConverters getObject() {
return httpMessageConverters;
}
});
}
}
}
今天的文章feign-form基本使用分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/22154.html