我通过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中的数据在哪里?提前谢谢。
答案 0 :(得分:4)
您可能希望将本地JS代码更改为浏览器中立:-)该代码仅适用于IE。 (但这不是手头的问题)。 XPage是一个生命周期管理的服务器构造,并不是为处理抛出的任意数据而设计的。
处理您要执行的操作的推荐方法是使用扩展库中的REST控件。您可以为其配置网址部分,例如data
,因此您要发布到baseURL + "/echoxml.xsp/data"
。你可以在一个变量中轻松获得有效载荷。
如果您愿意,Rest控件还支持使用自定义Java类。
最后一个选项是添加自定义servlet。以下是步骤:
com.acme.EchoFactory
编写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;
}
}
实施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!
}
希望有所帮助
答案 1 :(得分:0)
((HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest()).getInputStream()
答案 2 :(得分:0)
关于stwissel的回答,扩展库中REST控件的缺点是不尊重服务器设置的HTTP头,因此对CORS请求没有用,因此对混合移动应用程序没有用。