我需要一种创建动态/通用休息客户端的方法。我的spring boot应用程序需要连接到许多第三方客户端,所有这些客户端都有不同的请求正文,响应正文,有些需要特殊的标头,而有些则需要特殊的授权/身份验证(例如,基本身份验证,JWT,HMAC等)。
到目前为止,我已经设法提出了以下客户端
public class GenericRestClient<T, V> {
private RestTemplate restTemplate = new RestTemplate();
public V execute(RequestDetails requestDetails, T data, ResponseErrorHandler errorHandler,
Class<V> genericClass) throws ResourceAccessException, Exception {
restTemplate.setErrorHandler(errorHandler);
HttpHeaders headers = new HttpHeaders();
HttpEntity<T> entity = new HttpEntity<T>(data, headers);
ResponseEntity<V> response = restTemplate.exchange(requestDetails.getUrl(), requestDetails.getRequestType(),
entity, genericClass);
return response.getBody();
}
}
但是我的问题是。现在,当它们都有不同的要求时,是否有一种方法可以生成所有必要的标头,身份验证和授权?我该怎么办?
有没有一种方法可以将Java代码(例如脚本)(例如JTX)存储在数据库中并使用它们,还是有更好的方法来满足我的需要?
我希望这样,即使有新的客户来,也无需进行进一步的编码。
答案 0 :(得分:1)
您可以将每个客户端的配置存储在数据库中。如果您使用JPA,则最终会得到这样的类:
@Entity
class RestClientConfiguration{
private String url;
private Map<String,String> headers;
//whatever data you need
}
然后,您只需要将RestClientConfiguration
传递给您的GenericRestClient
类。
public class GenericRestClient<T, V> {
public V execute(RequestDetails requestDetails, T data, ResponseErrorHandler errorHandler,
Class<V> genericClass, RestClientConfiguration clientConfiguration) throws ResourceAccessException, Exception {
String url = clientConfiguration.getUrl();
Map<String, String> headerMap = clientConfiguration.getHeaders();
//here add code which map headerMap which is a Map to HttpHeaders object
RestTemplate restTemplate = new RestTemplate();
restTemplate.setErrorHandler(errorHandler);
HttpHeaders headers = new HttpHeaders();
HttpEntity<T> entity = new HttpEntity<T>(data, headers);
ResponseEntity<V> response = restTemplate.exchange(requestDetails.getUrl(), requestDetails.getRequestType(),
entity, genericClass);
return response.getBody();
}
}
就是这样。希望我能很好地满足您的需求。让我知道是否有不清楚的地方,我们会解决的:)