REST API 客户端实现,最佳实践是什么?

问题描述

我正在开发一个 HTTP 客户端 SDK,我在其中实现了桥接模式,架构如下所示:

enter image description here

这样做的原因是我可以为每种类型的 Message 实现多种类型的主体和 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,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 方法的方法。但是,我还没有看到您的完整请求。如果您有少量不同的东西,那么这种简单的提取可能足以避免重复代码。如果您有很多不同的东西,那么构建器可能是您的最佳选择。