需要使用 JSON 为 REST v2 API 传递 Jasper 报告参数的示例

Posted

技术标签:

【中文标题】需要使用 JSON 为 REST v2 API 传递 Jasper 报告参数的示例【英文标题】:Need Example of passing Jasper Reports Parameters for REST v2 API using JSON 【发布时间】:2014-09-21 10:41:40 【问题描述】:

当我在此处查看将参数传递给 Jasper Report REST 2 API 的文档时:http://community.jaspersoft.com/documentation/jasperreports-server-web-services-guide/v550/running-report-asynchronously 我发现我需要一个“参数”字典。链接中的示例显示了 XML,它并不是很有用,因为不清楚等效的 JSON 应该是什么样子。我能找到的最接近的是这个链接:http://community.jaspersoft.com/documentation/jasperreports-server-web-services-guide/v56/modifying-report-parameters。现在,我将等价的内容发送到服务器(以及我能想到的所有其他排列),并且我继续收到“400 客户端错误:错误请求”。我真的可以使用 python 代码的 exact 示例来生成所需的“parameters”参数,例如“my_parameter_1="test_value_1”。

这是我当前的 POST 数据(为简洁起见,缺少一些参数)。我知道这是正确的,因为如果我省略“parameters”参数,报告工作正常:

    
      'outputFormat': 'pdf', 
      'parameters': ['name': 'ReportID', 'value': ['my_value_1']], 
      'async': 'true', 
      'pages': '', 
      'interactive': 'false'
    

【问题讨论】:

【参考方案1】:

好的,感谢 rafkacz1 @ http://community.jaspersoft.com/questions/825719/json-equivalent-xml-post-reportexecutions-rest-service 发布了答案,我想通了。正如他在那里报告的那样,所需的格式是:

    "parameters":
         "reportParameter":[
             "name":"my_parameter_1","value":["my_value_1"]
          ]
     

要特别注意“reportParameter”的复数。

【讨论】:

【参考方案2】:

斯塔格特干得不错。我现在明白了。因为我没有用max阅读。审查,我浪费了一些额外的时间。因此,建议感兴趣的编码人员不仅要注意嵌套的、语法上有趣的 reportParameter-property,尤其是其中的 value-property 是一个数组。我想可以在这里传递某种形式的列表/数组/集合?

让我恼火的是,如果我应该构造多个“reportParameter”属性,但根据 Does JSON syntax allow duplicate keys in an object.

所以只是为了记录,如何发布多个参数:


    "reportUnitUri": "/reports/Top10/Top10Customers",
    "async": true,
    "freshData": true,
    "saveDataSnapshot": false,
    "outputFormat": "pdf",
    "interactive": false,
    "ignorePagination": true,
    "parameters": 
        "reportParameter": [
            
                "name": "DATE_START_STRING",
                "value": ["14.07.2014"]
            ,
            
                "name": "DATE_END_STRING",
                "value": ["14.10.2014"]
            
        ]
    

如果有人不小心难以通过 REST 和 php 与 jasper 进行通信。帮自己一个忙,使用 Requests for PHP 而不是纯 CURL。当 CURL 不可用时,它甚至可以在内部使用 Sockets 而不是 CURL。

为你投票。

【讨论】:

【参考方案3】:

这是一个关于使用 Rest V2 生成报告的完整示例,在我的例子中它在 C# 上运行:

try 
    var server = "http://localhost:8080/jasperserver";
    var login = server + "/rest/login";
    var report = "/rest_v2/reports/organization/Reports/report_name.pdf";
    var client = new WebClient();

    //Set the content type of the request
    client.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";

    //Set the username and password
    NameValueCollection parametros = new NameValueCollection();
    parametros.Add("j_username", "jasperadmin");
    parametros.Add("j_password", "123456");

    //Request to login
    client.UploadValues(login, "POST", parametros);

    //Get session cookie
    string session = client.ResponseHeaders.Get("Set-Cookie");

    //Set session cookie to the next request
    client.Headers.Add("Cookie", session);

    //Generate report with parameters: "start" and "end"
    var reporte = client.DownloadData(server + report + "?start=2015-10-01&end=2015-10-10");

    //Returns the report as response
    return File(reporte, "application/pdf", "test.pdf");
catch(WebException e)
    //return Content("There was a problem, status code: " + ((HttpWebResponse)e.Response).StatusCode);
    return null;

【讨论】:

【参考方案4】:

这是一个对我有用的例子。我使用 Python 2.7 和 Jaspersoft 的社区版。与上面的 C# 示例一样,此示例也使用了 rest v2,这让我可以非常简单地快速下载 pdf 报告

import requests

sess = requests.Session()   
auth = ('username', 'password')
res = sess.get(url='http://your.jasper.domain:8080/jasperserver/', auth=auth)
res.raise_for_status()
url = 'http://your.jasper.domain:8080/jasperserver/rest_v2/reports/report_folder/sub_folder/report_name.pdf'
params = 'Month':'2', 'Year':'2017','Project': 'ProjectName'
res = sess.get(url=url, params=params, stream=True)
res.raise_for_status()
path = '/path/to/Downloads/report_name.pdf'
with open(path, "wb") as f:
    f.write(res.content)

【讨论】:

以上是关于需要使用 JSON 为 REST v2 API 传递 Jasper 报告参数的示例的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 WordPress REST API v2 搜索帖子?

贝宝 Rest API SDK v2

Wordpress REST API:如何在 WP REST API JSON 文件中获取“纯文字”内容?

使用 slashdb rest api 将 json 数据插入 MySQL 数据库

Laravel Wordpress JSON REST API 给出奇怪的 Curl 错误

将多个参数传递给rest API - Spring