我想创建一个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并将处理结果。
答案 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 );