我有一个XPage,它有一个restService控件。
<xe:restService
id="restService1"
pathInfo="service"
state="false">
<xe:this.service>
<xe:customRestService
contentType="application/json"
serviceBean="com.domain.rest.Employee">
</xe:customRestService>
</xe:this.service>
</xe:restService>
我想从外部应用程序传递JSON数据。对于这个测试,我只是使用Chrome的postman插件。
我有一些获取REST动词的shell代码并将其发送到匹配的方法。方法的存根看起来像这样:
public void doPost( HttpServletRequest req, HttpServletResponse res, PrintWriter out ) {
// Do something here
this.doUnHandled(req, res, out);
}
我正在努力的是如何在Post的主体中阅读,以便我可以将传入的JSON转换为Map或其他我可以在我的Java代码中使用的东西,然后与Domino文档交互。我在网上找到了很多例子,但它们看起来都不一样,我也无法把它放在一起。
理想情况下,我想使用com.ibm.commons.util.io.json中的内置内容。我知道GSON和其他东西很受欢迎,但我只想先得到一些工作。
我最近的尝试就是这个例子:
public void doPost( HttpServletRequest req, HttpServletResponse res, PrintWriter out ) throws IOException, JsonException {
System.out.println("POSTING DATA");
Map<String, Object> result = (Map<String, Object>)
JsonParser.fromJson(JsonJavaFactory.instance, req.getReader());
Map<String, Object> foo = new HashMap<String, Object>();
foo.put("firstName", result.get("firstName"));
System.out.println(foo.get("firstName"));
this.doUnHandled(req, res, out);
}
我对此寄予厚望,但我得到一个错误,我不能使用缓冲的阅读器 - req.getReader() - 而ServletInputStream正在使用中。
我的理解是我所在的数据是在req.getInputStream()中,并且可能需要逐行读取,我也尝试过这个问题。
任何帮助或建议将不胜感激。谢谢!
答案 0 :(得分:1)
因此,如果您在请求正文中发送JSON,请执行以下操作:
{
"user" : "Mark",
"age" : 32
}
您可以使用java.util.Scanner
类从服务器上的POST请求中检索它(还有更多,但这是一种方法):
private static String extractPostRequestBody(HttpServletRequest request) {
Scanner s = null;
try {
s = new Scanner(request.getInputStream(), "UTF-8").useDelimiter("\\A");
} catch (IOException e) {
e.printStackTrace();
}
return s.hasNext() ? s.next() : "";
}
最后一步是使用内置的Map
包将其转换为com.ibm.commons.util.io.json
:
String requestBody = extractPostRequestBody(request);
Map<String, Object> result = (Map<String, Object>) JsonParser.fromJson(JsonJavaFactory.instance, requestBody);
获得地图后即可:
String user = (String) result.get("user");