如何在XPage中使用XML POST?

时间:2014-03-19 19:59:18

标签: xml http-post xpages lotusscript msxml

我通过POST将XML数据作为内容类型text / xml发送到XPage,但我无法从XPage中找到数据。 param.ToString()只返回“{}”。但是,param将返回URL中的参数。这是Xpage(render =“false”)的afterRenderResponse事件中的服务器端javascript:

var extCont = facesContext.getExternalContext(); 
var pageOutput = facesContext.getResponseWriter(); 
var pageResponse = extCont.getResponse(); 
pageResponse.setContentType("text/xml"); 
pageResponse.setHeader("Cache-Control", "no-cache"); 

//Get data from POST
var data = param.toString();
//echo back what was POSTed
pageOutput.write(data);

pageOutput.endDocument(); 
facesContext.responseComplete(); 

为var数据返回的所有内容都是“{}”如何访问已发布的XML数据?

XML数据是通过LotusScript代理发布的,当我使用它发布到另一个API(未在Notes中开发)时,它可以正常工作:

xmldata = "<tag>TEST</tag>"
Set httpObject = CreateObject("MSXML2.ServerXMLHTTP")
httpURL = baseURL + "/echoxml.xsp"
Call httpObject.open("POST", httpURL, False)
Call httpObject.setRequestHeader("Content-Type", "text/xml")
Call httpObject.send( xmldata )
httpStatus = httpObject.Status
Print "Status = "+CStr(httpStatus)

我的状态代码为200,表示POST成功。

XPage中的数据在哪里?提前谢谢。

3 个答案:

答案 0 :(得分:4)

您可能希望将本地JS代码更改为浏览器中立:-)该代码仅适用于IE。 (但这不是手头的问题)。 XPage是一个生命周期管理的服务器构造,并不是为处理抛出的任意数据而设计的。

处理您要执行的操作的推荐方法是使用扩展库中的REST控件。您可以为其配置网址部分,例如data,因此您要发布到baseURL + "/echoxml.xsp/data"。你可以在一个变量中轻松获得有效载荷。

如果您愿意,Rest控件还支持使用自定义Java类。

最后一个选项是添加自定义servlet。以下是步骤:

  1. 打开导航器视图,并将/Code/Java/META-INF/services/com.ibm.xsp.adapter.servletFactory创建为文本文件(确切名称)
  2. 添加一行,其中包含您的servlet名称。例如。 com.acme.EchoFactory
  3. 编写echo工厂类:

    public class EchoFactory implements IServletFactory{
    private ComponentModule module;
    
    public ServletMatch getServletMatch(final String contextPath, final String path) throws ServletException {
    
        if (path.startsWith("/xsp/echo")) {
            return new ServletMatch(module.createServlet("com.acme.EchoServlet", "Can you hear it?", null),"",path);
        }
    
        return null;
        }
    
    public void init(final ComponentModule module) {
        this.module = module;    
        }
    }
    
  4. 实施Echo Servlet

       public class EchoServlet extends DesignerFacesServlet {
           @Override
           public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
                HttpServletRequest req = (HttpServletRequest) servletRequest;
                HttpServletResponse res = (HttpServletResponse) servletResponse;
                FacesContext facesContext = this.getFacesContext(req, res);
                        String method = req.getMethod();
                        // Your code goes here!
               }
    
  5. 希望有所帮助

答案 1 :(得分:0)

斯蒂芬是对的,xpages并不一定意味着做你想要的,但他们当然可以。要获取xml句柄,你需要做的是使用下面的代码使用getInputStream方法,这是POSTed数据应该去的地方。获得InputStream后,您可以将其读回文件或显示任何您想要的内容。

((HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest()).getInputStream()

答案 2 :(得分:0)

关于stwissel的回答,扩展库中REST控件的缺点是不尊重服务器设置的HTTP头,因此对CORS请求没有用,因此对混合移动应用程序没有用。