1

我需要使用函数 SSJS fromJson() 读取 URL。例如,Notes 视图的数据访问 API

http://{host}/{database}/api/data/collections/name/{name}

我怎样才能做到这一点 ?

PS 我认为(我不知道是否属实)如果我使用 Java 代码(例如来自这个博客的类 URLReader,我会失去作者/读者功能,因为是我的服务器而不是执行读取的当前用户溪流?

我会解释为什么我试图理解这一点......

我需要在我的应用程序中使用这个插件 JQuery Jquery Data Tables。我需要一个完整的服务器端处理,因为我有超过 10.000 个文档用于任何视图。此 jQueryPlugin 将参数发送到特定 URL(我认为是我的 XAgent),以便创建一个读取此参数并解析 JSON API 数据以输出的 XAgent。这是因为我需要快速响应。

Oliver Busse的解决方案非常慢,因为在 JSON 中加载我的视图的所有条目(我有很多条目)并且我等待 30/40 秒进行此操作

4

2 回答 2

2

我从 PS 中收集到,您特别希望从服务器本身获取 JSON,同时保留用户身份验证信息。Sven 的帖子做了一些这样的事情,但我认为最可靠的方法是从请求中获取 Authorization 和 Cookie 标头,然后在您的 URL 请求中传递它们。这个答案为使用 Java 执行此操作提供了良好的基础。你可以扩展它来做这样的事情(当然,我没有测试过,但这是一个起点):

    HttpServletRequest req = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();
    String authorization = req.getHeader("Authorization");
    String cookie = req.getHeader("Cookie");

    URL myURL = new URL("http://foo.com");
    HttpURLConnection myURLConnection = (HttpURLConnection)myURL.openConnection();
    if(StringUtil.isNotEmpty(authorization)) {
        myURLConnection.setRequestProperty("Authorization", authorization);
    }
    if(StringUtil.isNotEmpty(cookie)) {
        myURLConnection.setRequestProperty("Cookie", cookie);
    }
    myURLConnection.setRequestMethod("GET");
    myURLConnection.setDoInput(true);
    myURLConnection.setDoOutput(true);
    myURLConnection.connect();
    InputStream is = null;
    try {
        is = myURLConnection.getInputStream();
        String result = StreamUtil.readString(is);
    } finally {
        StreamUtil.close(is);
        myURLConnection.disconnect();
    }

理想情况下,您还可以从请求中获取服务器主机名、协议和端口。

Eric 的评论也很明智:如果这是您可以对普通类执行的操作,那么由于服务器自身的 HTTP 调用非常复杂,这将更加灵活且不易出现问题。

于 2015-11-05T14:22:31.547 回答
2

正如我在评论中提到的,这种方法强制您的调用通过对 Domino 数据服务的客户端调用,否则会使通过跨 NSF 调用(例如 - var vwEnt:ViewEntryCollection = session.getDatabase("serverName", "path/myDb.nsf").getView("viewName").getAllEntries();)。

正如我之前的一篇博文所述,您绝对可以按照 Jesse 的回答(诅咒你的快速打字机 Jesse!)概述来实现这一点。我的工具“抓包”中包含一个 Java 类,它是获取 JSON 格式内容的起点。这是链接(这里是一个在请求标头中具有基本授权的链接)和我通常开始的类:

package com.eric.awesome;

import java.net.URL;
import java.net.URLConnection;
import java.io.BufferedReader;
import com.google.gson.*;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.IOException;
import java.net.MalformedURLException;
import org.apache.commons.validator.routines.*;

/**
 * Class with a single, public, static method to provide a  REST consumer
 * which returns data as a JsonObject.
 * 
 * @author Eric McCormick, @edm00se
 * 
 */
public class CustJsonConsumer {
    /**
     * Method for receiving HTTP JSON GET request against a RESTful URL data source.
     * 
     * @param myUrlStr the URL of the REST endpoint
     * @return JsonObject containing the data from the REST response.
     * @throws IOException
     * @throws MalformedURLException
     * @throws ParseException 
     */
    public static JsonObject GetMyRestData( String myUrlStr ) throws IOException, MalformedURLException {
        JsonObject myRestData = new JsonObject();
        try{

            UrlValidator defaultValidator = new UrlValidator();
            if(defaultValidator.isValid(myUrlStr)){

                URL myUrl = new URL(myUrlStr);
                URLConnection urlCon = myUrl.openConnection();
                urlCon.setConnectTimeout(5000);
                InputStream is = urlCon.getInputStream();
                InputStreamReader isR = new InputStreamReader(is);
                BufferedReader reader = new BufferedReader(isR);
                StringBuffer buffer = new StringBuffer();
                String line = "";
                while( (line = reader.readLine()) != null ){
                    buffer.append(line);
                }
                reader.close();
                JsonParser parser = new JsonParser();
                myRestData = (JsonObject) parser.parse(buffer.toString());

                return myRestData;

            }else{
                myRestData.addProperty("error", "URL failed validation by Apache Commmons URL Validator");
                return myRestData;
            }
        }catch( MalformedURLException e ){
            e.printStackTrace();
            myRestData.addProperty("error", e.toString());
            return myRestData;
        }catch( IOException e ){
            e.printStackTrace();
            myRestData.addProperty("error", e.toString());
            return myRestData;
        }
    }
}

要从 SSJS 作为 POJO 调用,您需要执行以下操作:

importPackage(com.eric.awesome);

var urlStr = "http://{host}/{database}/api/data/collections/name/{name}";
var myStuff:JsonObject = CustJsonConsumer.GetMyRestData(urlStr);
于 2015-11-05T14:29:19.257 回答