发送HTTP请求
在以往的 HTTP 调用中,调用方式经常将组装代码冗余到正常业务代码中,不够优雅,因此在接触到 Feign 后,考虑使其作为一个 HTTP 发送基础,来进行远程调用。
Feign ,搞定 HTTP 请求
以springboot
项目为例
1、引入依赖
<!-- feign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- 用于解析数据 -->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-jackson</artifactId>
<version>9.7.0</version>
</dependency>
2、HTTP发送端
package com.example.xmldemo.feignService;
import com.example.xmldemo.result.Project1369CategoryTreeVo;
import com.example.xmldemo.result.ViewProjectReportParam;
import feign.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.http.HttpStatus;
import java.util.*;
public interface OutsideCallService {
@RequestLine("GET /api/biz/outside/uploadProjectInfo?zjlx={zjlx}&gnfl={gnfl}&jzmj={jzmj}&filePath={filePath}&fileId={fileId}")
Result<Long> uploadProjectInfo(@Param("zjlx") String zjlx, @Param("gnfl") String gnfl, @Param("jzmj") Double jzmj, @Param("filePath") String filePath, @Param("fileId") String fileId);
@RequestLine("GET /api/biz/outside/tree")
Result<List<Project1369CategoryTreeVo>> tree();
@RequestLine("POST /api/biz/outside/post")
@Headers({"Content-Type: application/json"})
Result<ViewProjectReportParam> postBook2(ViewProjectReportParam bookVo);
@Data
@AllArgsConstructor
@NoArgsConstructor
class Result<T> {
// HTTP Response Status Code
private HttpStatus httpStatus;
private Integer status;
// General Error message
private String message;
private Integer code;
// Error code
private String serviceStatus;
private Date timestamp = new Date();
private T data;
private T extendData;
}
}
3、测试
package com.example.xmldemo;
import com.example.xmldemo.feignService.OutsideCallService;
import com.example.xmldemo.result.Project1369CategoryTreeVo;
import com.example.xmldemo.result.ViewProjectReportParam;
import feign.Feign;
import feign.jackson.JacksonDecoder;
import feign.jackson.JacksonEncoder;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import java.util.List;
/**
* @Author: DuXueXin
* @CreateTime: 2021-12-30 10:51
* @Version: 1.0
*/
public class FeignTest {
@Test
public void test1(){
OutsideCallService target = Feign.builder()
.decoder(new JacksonDecoder())
.encoder(new JacksonEncoder())
.target(OutsideCallService.class, "http://localhost:8889");
OutsideCallService.Result<Long> tree = target.uploadProjectInfo("002008001","001001001001002",122d,"http://localhost:8987/download","22222");
Long data = tree.getData();
System.out.println(data);
}
@Test
public void test2(){
OutsideCallService target = Feign.builder()
.decoder(new JacksonDecoder())
.encoder(new JacksonEncoder())
.target(OutsideCallService.class, "http://localhost:8889");
OutsideCallService.Result<List<Project1369CategoryTreeVo>> tree = target.tree();
List<Project1369CategoryTreeVo> children = tree.getData();
System.out.println(children);
}
@Test
public void test3(){
OutsideCallService target = Feign.builder()
.decoder(new JacksonDecoder())
.encoder(new JacksonEncoder())
.target(OutsideCallService.class, "http://localhost:8889");
ViewProjectReportParam viewProjectReportParam = new ViewProjectReportParam();
viewProjectReportParam.setProjectId(23233L);
viewProjectReportParam.setType(232);
OutsideCallService.Result<ViewProjectReportParam> tree = target.postBook2(viewProjectReportParam);
ViewProjectReportParam data = tree.getData();
System.out.println(data);
}
}