REST API客户端的设计

时间:2017-03-20 12:07:25

标签: java rest design-patterns

我想创建一个REST API客户端,对于同一个REST API服务器,它将调用不同的URL。这些不同的调用将JSON和XML返回给客户端。 这种情况的优秀设计模式是什么?

到目前为止,我已经提出了战略和命令的组合:

public interface IRestCall {
    /** Setup the URL for the call. */
    void setup(IRestSetup setup) throws Exception;
    /** Execute the call, using the URL set up in the first step. 
     * @throws Exception */
    void call() throws Exception;
    /** Process the result and return to the user. */
    <T> T getResult(IRestResultProcessor<T> result) throws Exception;
} 

这是策略界面。该战略的背景将是 在Facade类中使用一些Get / Post / Put方法。

IRestSetup和IRestResultProcessor是Command对象的接口 这将设置REST API的URL并将处理结果。

1 个答案:

答案 0 :(得分:0)

我认为你不需要一些特殊的设计模式来处理这种情况。我个人只会为GET和POST请求添加一些通用方法。下面的代码只处理GET请求,但它应该足以让我知道我的意思。

处理GET请求的客户端方法可能类似于

/**
restUrl - url to the service 
resClz - the actual POJO object that the JSON or XML response will be mapped to
resType - type of MIME object returned by the server (typically MediaType.APPLICATION_JSON or MediaType.APPLICATION_XML)
*/  
  <T> T doRestGet(String restUrl, Class<T> resClz, String resType){

        T obj;
        Client client = ClientBuilder.newClient();            

        WebTarget target = client.target(UriBuilder.fromUri("http://localhost:8088/Your_WS_root").build()); 

        try{

         obj =(T) target.path(restUrl).request()
              .accept(resType).get().readEntity(resClz);


        }catch(Exception e){
         System.out.println(e);//log or propagate the exception

        return null;
        }
        return obj;
}

您的服务器方法可能类似于

@GET
  @Path("/userMsg")
  @Produces(MediaType.APPLICATION_JSON)
  public UserMessage getUsersOne() {

   UserMessage uMsg = new UserMessage();
   uMsg.setUserMsg("successful call");
   return uMsg;
  }

现在您拨打您的服务

UserMessage uMsg = (UserMessage)doRestGet("userMsg", UserMessage.class, MediaType.APPLICATION_JSON );