我想为我的 XPage 应用程序设置一些基本的 REST 服务。因此,我在 xpage 上添加了 xe:restService 控件,并选择 xe:customRestService,其中我引用了 Java 类:
<xe:restService id="restService1" pathInfo="json" state="false">
<xe:this.service>
<xe:customRestService contentType="application/json"
serviceBean="se.banking.desk.CustomSearchHelper">
</xe:customRestService>
</xe:this.service>
</xe:restService>
CustomSearchHelper 类本身仍然很空,但我想知道我是否走在正确的轨道上?
这是该类的代码:
package se.banking.desk;
import java.io.IOException;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.ibm.domino.services.ServiceException;
import com.ibm.domino.services.rest.RestServiceEngine;
import com.ibm.xsp.extlib.component.rest.CustomService;
import com.ibm.xsp.extlib.component.rest.CustomServiceBean;
public class CustomSearchHelper extends CustomServiceBean {
@Override
public void renderService(CustomService service, RestServiceEngine engine) throws ServiceException {
HttpServletRequest request = engine.getHttpRequest();
String method = request.getMethod();
HttpServletResponse response = engine.getHttpResponse();
response.setHeader("Content-Type", "text/javascript; charset=UTF-8");
if(method.equals("GET")){
this.get(engine);
}
else if(method.equals("POST")){
this.post(engine,request);
}
else{
this.other(engine);
}
}
public void get(RestServiceEngine engine){
HttpServletResponse response = engine.getHttpResponse();
try {
response.getWriter().write("get()");
response.getWriter().close();
return;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void post(RestServiceEngine engine,HttpServletRequest request){
HttpServletResponse response = engine.getHttpResponse();
Map parameters = request.getParameterMap();
try {
response.getWriter().write("post()");
response.getWriter().write( request.getParameter("form"));
String[] form = (String[])parameters.get("form");
String val = form[0];
response.getWriter().write(val);
response.getWriter().close();
} catch (Exception e) {
// TODO: handle exception
}
}
public void other(RestServiceEngine engine){
HttpServletResponse response = engine.getHttpResponse();
try {
response.getWriter().write("other()");
response.getWriter().close();
return;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
我的问题: 这是编写自定义 REST 服务的好方法吗?还有其他选择吗?在哪里可以找到更多从入门级开始的示例/信息?
你问了一个相当复杂的问题,这个问题在过去几年里一直萦绕在我的脑海里。我的评估是,找到“好方法”取决于开发人员和应用程序中使用的约定。我提供了我认为可用的替代方案来源的链接,其中有一些是我的,其中尝试从头开始解决一些概念,例如我的http servlet 系列.
[更新]我编辑了这个答案以包含一些代码示例,因为链接最终有可能不起作用;这应该保留答案的意图。[/更新]
您的实施是一个很好的例子,说明了如何xe:休息服务控件可以轻松绑定到 XPage,并可在 XPages 运行时和 Domino 服务器中使用多种选项。
据我所知,大约有 5 种独特的方法可以实现 RESTful API/端点以在 XPage 上下文中进行操作。按照易于实施的一般顺序(取决于个人):
-
XAgent(这可以与下一个交换;优点是易于上手,有大量可用示例,并且对于那些没有 Java 经验的人来说不那么令人畏惧,可以在 SSJS 或 Java 中完成)
<?xml version="1.0" encoding="UTF-8"?>
<xp:view
xmlns:xp="http://www.ibm.com/xsp/core"
rendered="false"
viewState="nostate">
<xp:this.afterRenderResponse>
<![CDATA[#{javascript:com.demo.DataProvider.myCustomDataServiceAsJson();}]]>
</xp:this.afterRenderResponse>
XAgent. This will not render as a page, but as application/json data.
</xp:view>
- the best part about the xe:restService is the out-of-the-box options for things like xe:viewJsonService (Domino devs already think in terms of Views and Documents, which are somewhat analogous to a RESTful API's mechanics of collections and records), as Mark pointed out in the comments; these are rather easy to get into and convenient (many people have blogged about these, Brad has covered some of these rather extensively in his data grids series)
-
xe:休息服务,或者作为自定义服务Bean正如您在上面所示的
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)