当前位置: 首页 > 知识库问答 >
问题:

如何从URL获取JSON

席宜修
2023-03-14

我需要用函数SSJS from mJson()读一个URL。例如Notes View的数据访问API

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

我该怎么做?

P. S我认为(我不知道是否是真的),如果我使用Java代码(例如类URLReader从这个博客,我失去作者/读者的功能,因为是我的服务器,而不是当前用户执行读取流?

我会解释为什么我要理解这个。。。

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

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

共有2个答案

后阳炎
2023-03-14

正如我在评论中提到的,这种方法强制您的调用通过对Domino数据服务的客户端调用进行,并通过跨NSF调用(例如-var vwEnt:ViewEntryCollection=session.getDatabase(“serverName”,“path/myDb.NSF”).getView(“viewName”)在视图(及其内容)上建立一个普通句柄,从而使之复杂化.getAllEntries();)。

正如我之前的一篇博文所概述的,你完全可以用杰西的答案来实现这一点(诅咒你,快打字的杰西!)轮廓。我在工具的“抓取包”中包括一个Java类,它是获取JSON格式内容的起点。这是链接(这是一个在请求头中具有基本授权的链接)和类I通常从以下位置开始:

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;
        }
    }
}

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

js prettyprint-override">importPackage(com.eric.awesome);

var urlStr = "http://{host}/{database}/api/data/collections/name/{name}";
var myStuff:JsonObject = CustJsonConsumer.GetMyRestData(urlStr);
商茂勋
2023-03-14

我从PS得知,您特别希望在服务器上从自身获取JSON,同时保留用户身份验证信息。Sven在那里的帖子有点类似,但我认为最可靠的方法是从请求中获取授权和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调用可以是多么灵活。

 类似资料:
  • 你好,我来自从URL获取JSON对象 我试着去买一顶帽子- 有人能告诉我我做错了什么吗?

  • 问题内容: 关闭。 此问题不符合堆栈溢出准则。它当前不接受答案。 想改善这个问题吗? 更新问题,使其成为Stack Overflow 的主题。 6年前关闭。 我想从URL获取值,以按ID从数据库中选择数据。我想要ID值。 例如,如果我打开数据库, 我想获取id = 12的值。 如果我打开,则 获取数据库中id = 7的值,依此类推。 我有一些代码: 问题答案: 网址: 码:

  • 问题内容: 此URL返回JSON: 我尝试了一下,但没有成功: 如何从该URL的JSON响应中获取JavaScript对象? 问题答案: 您可以使用jQuery 函数:

  • 问题内容: 我正在尝试获取Firebase存储桶中文件的“长期持久下载链接”。我已将其权限更改为 我的javacode看起来像这样: 当我运行它时,我得到的uri链接看起来像 com.google.android.gms.tasks.zzh@xxx 问题1.我是否可以从中获得类似于以下内容的下载链接:https : //firebasestorage.googleapis.com/v0/b/pro

  • 问题内容: 尝试在SafariViewController中使用Facebook OAuth。首先,我使用SafariViewController打开authURL,如果用户在Safari上登录Facebook,它将重定向它们并返回带有该特定服务令牌的OAuth URL,例如Instagram 响应:https : //www.facebook.com/connect/login_success.

  • 问题内容: 我想从JavaScript的YouTube网址中获取(没有jQuery,纯JavaScript)。 YouTube URL格式示例 或网址中包含视频ID的任何其他YouTube格式。 这些格式的结果 问题答案: 您不需要为此使用正则表达式。