参考目录
阅读完需:约 2 分钟
Feign和普通参数传递的区别:
- 参数一定要绑定参数名。
- 如果通过 header 来传递参数,一定记得中文要转码。
测试的服务端接口,继续使用 provider 提供的接口。
1.添加调用接口
这里,我们主要在 openfeign 中添加调用接口即可:
@FeignClient(value = "provider")
public interface HelloService {
@GetMapping("/hello")
String hello();//这里的方法名无所谓,随意取
@GetMapping("/hello2")
String hello2(@RequestParam("name") String name);
@PostMapping("/user2")
User addUser2(@RequestBody User user);
@DeleteMapping("/user2/{id}")
void deleteUser2(@PathVariable("id") Integer id);
@GetMapping("/user3")
void getUserByName(@RequestHeader("name") String name);
}
注意,凡是 key/value 形式的参数,一定要标记参数的名称。
provider (生产者)的接口也和 openfeign 中的一样,@FeignClient(value = “provider”) 中的 provider 代表了另一个服务实例的名称,而restful接口对应的 provider 里面的接口名称!
比如 hello 接口主要是接收一个String类型的参数,参数通过key-value的形式传来,然后返回一个String类型的数据; (数据类型不能错)
2.调用接口
HelloController 中调用 HelloService:
@RestController
public class HelloController {
@Autowired
HelloService helloService;
@GetMapping("/hello")
public String hello() throws UnsupportedEncodingException {
String s = helloService.hello2("uuuuu");
System.out.println(s);
User user = new User();
user.setId(1);
user.setUsername("uuuuu");
user.setPassword("123");
User u = helloService.addUser2(user);
System.out.println(u);
helloService.deleteUser2(1);
helloService.getUserByName(URLEncoder.encode("阿瑟东", "UTF-8"));
return helloService.hello();
}
}
getUserByName 接口接收到参数携带在请求头中,请求头中传递中文会乱码,所以要先编码,再解码(当然如果传递的是英文就不用这么麻烦)
在 provider 中 getUserByName 的接口:
@Override
public void getUserByName(@RequestHeader String name) throws UnsupportedEncodingException {
System.out.println(URLDecoder.decode(name, “UTF-8”));
}需要对 name 参数解码
这里有一个细节需要小伙伴们注意,在SpringMVC中,@RequestParam和@RequestHeader注解,如果我们不指定value,则默认采用参数的名字作为其value,但是在Feign中,这个value必须明确指定,否则会报错。