REST API 客户端实现,最佳实践是什么?
REST API client implementation, what is the best practice?
我正在开发一个 HTTP 客户端 SDK,我在其中实现了桥接模式,架构如下所示:
这样做的原因是我可以为每种类型的消息实现多种类型的正文和 HTTP 方法,因此我相信我会减少 类 创建的数量。
我注意到并困扰我很多的事情是在 SMS 请求部分我重复了很多 RestTemplate 代码来发送提交示例:
@Override
public AdvancedSmsResponse postMessage() {
super.httpHeaders.set("Authorization", super.authorization.toBase64());
super.httpHeaders.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
super.httpHeaders.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<Object> entity = new HttpEntity<>(smsAdvanced, httpHeaders);
try{
ResponseEntity<AdvancedSmsResponse> response = super.requestRestTemplate.exchange(getUrlHost(), HttpMethod.POST, entity, AdvancedSmsResponse.class);
objectMapper.configure(SerializationFeature.INDENT_OUTPUT, true);
String smsResponseLog = objectMapper.writeValueAsString(response.getBody());
super.LOGGER.info( "\n" + response.getStatusCode() + "\n" + smsResponseLog);
return response.getBody();
}catch (HttpStatusCodeException | JsonProcessingException e){
return null;
}
}
@Override
public Object getDeliveryReport() {
super.httpHeaders.set("Authorization", super.authorization.toBase64());
super.httpHeaders.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
super.httpHeaders.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<Object> entity = new HttpEntity<>(null, httpHeaders);
try{
ResponseEntity<AdvancedSmsResponse> response = super.requestRestTemplate.exchange(getUrlHost() + "/report", HttpMethod.GET, entity, AdvancedSmsResponse.class);
objectMapper.configure(SerializationFeature.INDENT_OUTPUT, true);
String smsResponseLog = objectMapper.writeValueAsString(response.getBody());
super.LOGGER.info( "\n" + response.getStatusCode() + "\n" + smsResponseLog);
return response.getBody();
}catch (HttpStatusCodeException | JsonProcessingException e){
return null;
}
}
这个实现好吗?还有有没有办法避免请求执行部分重复这么多?
我很想提取一个接受 HttpEntity、路径和 HTTP 方法的方法。但是,我还没有看到您的全部请求。如果您有少量不同的东西,那么这种简单的提取可能足以避免重复代码。如果您有很多不同的东西,那么建造者可能是您的不二之选。
我正在开发一个 HTTP 客户端 SDK,我在其中实现了桥接模式,架构如下所示:
这样做的原因是我可以为每种类型的消息实现多种类型的正文和 HTTP 方法,因此我相信我会减少 类 创建的数量。
我注意到并困扰我很多的事情是在 SMS 请求部分我重复了很多 RestTemplate 代码来发送提交示例:
@Override
public AdvancedSmsResponse postMessage() {
super.httpHeaders.set("Authorization", super.authorization.toBase64());
super.httpHeaders.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
super.httpHeaders.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<Object> entity = new HttpEntity<>(smsAdvanced, httpHeaders);
try{
ResponseEntity<AdvancedSmsResponse> response = super.requestRestTemplate.exchange(getUrlHost(), HttpMethod.POST, entity, AdvancedSmsResponse.class);
objectMapper.configure(SerializationFeature.INDENT_OUTPUT, true);
String smsResponseLog = objectMapper.writeValueAsString(response.getBody());
super.LOGGER.info( "\n" + response.getStatusCode() + "\n" + smsResponseLog);
return response.getBody();
}catch (HttpStatusCodeException | JsonProcessingException e){
return null;
}
}
@Override
public Object getDeliveryReport() {
super.httpHeaders.set("Authorization", super.authorization.toBase64());
super.httpHeaders.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
super.httpHeaders.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<Object> entity = new HttpEntity<>(null, httpHeaders);
try{
ResponseEntity<AdvancedSmsResponse> response = super.requestRestTemplate.exchange(getUrlHost() + "/report", HttpMethod.GET, entity, AdvancedSmsResponse.class);
objectMapper.configure(SerializationFeature.INDENT_OUTPUT, true);
String smsResponseLog = objectMapper.writeValueAsString(response.getBody());
super.LOGGER.info( "\n" + response.getStatusCode() + "\n" + smsResponseLog);
return response.getBody();
}catch (HttpStatusCodeException | JsonProcessingException e){
return null;
}
}
这个实现好吗?还有有没有办法避免请求执行部分重复这么多?
我很想提取一个接受 HttpEntity、路径和 HTTP 方法的方法。但是,我还没有看到您的全部请求。如果您有少量不同的东西,那么这种简单的提取可能足以避免重复代码。如果您有很多不同的东西,那么建造者可能是您的不二之选。