Fenómeno problema:
Recientemente, estoy estudiando cómo usar Fegin para llamar a interfaces de servicios de terceros y establecer encabezados y parámetros de solicitud. Encontré las características de la anotación de método @Header, el atributo de parámetro @RequestHeader y la anotación de método @Requestmapping encabezados de atributo , así como los atributos de parámetro @RequestParam y atributos de parámetro @Param Y las características del método de anotación @Requestmapping atributo params .
análisis del problema:
Observemos un ejemplo de cómo llamar con éxito a la interfaz de Fegin en mi proyecto . Este es un método de interfaz getToken definido en la interfaz de Fegin :
application.properties:
test-url=第三方服务接口ip地址和端口号
TestFegin:
@FeignClient(name = "test", url = "${test-url}")
@Component
public interface TestFegin {
//获取用户的token
@PostMapping(value = "/auth/oauth/token",
headers = {"Authorization=Basic c2FiZXI6c2FiZXJfc2VjcmV0","content-type=application/x-www-form-urlencoded"})
JSONObject getToken(@RequestHeader("Tenant-Id") String tenantId,
@RequestParam(value = "grant_type", defaultValue = "password") String grantType,
@RequestParam("username") String username,
@RequestParam("password") String password);
}
TestController:
@CrossOrigin
@RestController
public class TestController {
@Autowired TestFegin testFegin;
/**
* 获取token
*
* @return
*/
@PostMapping("/getToken")
public JSONObject getToken(@RequestBody JSONObject jsonObject) {
JSONObject response = new JSONObject();
if ( isLogin ) {
response.put("status", "fail");
response.put("msg", "登录失败!");
}
String tenantId = jsonObject.getString("tenantId");
String username = jsonObject.getString("username");
String password = jsonObject.getString("password");
JSONObject tokenInfo = testFegin.getToken(tenantId, "password", username, password);
response.put("msg", "成功");
response.put("code", 200);
response.put("data", tokenInfo);
return response;
}
}
Resultados de la prueba:
Se pueden aprender algunos conocimientos de este ejemplo:
1. En la propiedad de encabezados de @Requestmapping (incluido GetMapping / PostMapping) , puede establecer el encabezado de la solicitud:
Ventajas: de esta manera, puede establecer automáticamente la información predeterminada del encabezado de solicitud de la interfaz , por lo que la llamada requiere encabezados de solicitud entrantes , cuyos encabezados de solicitud son una interfaz fija cuando puede usar esta forma.
2. @RequestHeader, utilizado para pasar manualmente la información del encabezado de la solicitud.
Características: Puede pasar manualmente la información del encabezado de la solicitud personalizada a la interfaz de Fegin.
3. Anotación de método @Header y @Requestmapping (incluido GetMapping / PostMapping) atributo de encabezados , se dice que el uso y la función son casi los mismos, así que lo probé y descubrí que no funciona. Se puede ver que los rumores son falsos, y se estima que también lo son ¿Cuáles son las desventajas,
Debido a que el método anotado @Header ha sido abandonado , y ahora es una necesidad básica de esta manera, por lo que no se recomienda que use la anotación , compañero interesado, puede ir a aprender más sobre:
//获取用户的token
@Headers({"Authorization=Basic c2FiZXI6c2FiZXJfc2VjcmV0","content-type=application/x-www-form-urlencoded"})
@PostMapping(value = "/blade-auth/oauth/token")
JSONObject getToken(@RequestHeader("Tenant-Id") String tenantId,
@RequestParam(value = "grant_type", defaultValue = "password") String grantType,
@RequestParam("username") String username,
@RequestParam("password") String password);
4. @RequestParam: Se utiliza para pasar parámetros a la interfaz . El parámetro determinará la forma de existencia del parámetro de acuerdo con el valor del atributo del tipo de contenido del encabezado de la solicitud . Por ejemplo, en el ejemplo, son datos de formulario ( application / x-www-form-urlencoded ) Existe, y de forma predeterminada, existe en la forma en que la barra de direcciones es visible . Se dice que el atributo defaultValue puede establecer valores predeterminados como:
http: // ip: puerto? parámetro1 = valor1 & parámetro2 = valor2 ...
Si desea utilizar el estilo de existencia relajante , utilizará @PathVariable.
5. Parámetros de atributo @ Requestmapping : se usa para limitar la lista de parámetros de la interfaz. Solo cuando se cumplen las condiciones, la interfaz se puede llamar con éxito, de lo contrario, será interceptada y la llamada de la interfaz fallará. La prueba encuentra que no hay ventaja .
//获取用户的token
@PostMapping(value = "/blade-auth/oauth/token",
headers = {"Authorization=Basic c2FiZXI6c2FiZXJfc2VjcmV0","content-type=application/x-www-form-urlencoded"},
params = {"grant_type=password"})
JSONObject getToken(@RequestHeader("Tenant-Id") String tenantId,
@RequestParam(value = "grant_type", defaultValue = "password") String grantType,
@RequestParam("username") String username,
@RequestParam("password") String password);
Desventajas: el valor del parámetro predeterminado no se puede establecer automáticamente como el atributo de encabezados, y el valor del parámetro aún debe pasarse manualmente.
6. @Param, esta anotación se usa a menudo en la capa dao / mapper como una anotación de parámetro.
Características: puede ser una llamada de método , el parámetro codificado entrante, pero no requiere la lista de parámetros para definir el método de paso del parámetro de orden , a menudo anotaciones sobre parámetros que tienen una pluralidad de métodos abstractos en los parámetros de la capa dao.
capas de dao:
List<JSONObject> getInfoJson(@Param("tableName") String tableName, @Param("columns") String columns, @Param("where") String where);