在XPages中如何从REST调用中获取POST主体?

时间:2016-12-01 18:17:01

标签: xpages xpages-extlib

我有一个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()中,并且可能需要逐行读取,我也尝试过这个问题。

任何帮助或建议将不胜感激。谢谢!

1 个答案:

答案 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");