关于python:需要使用JSON为REST v2 API传递Jasper Reports参数的示例

Need Example of passing Jasper Reports Parameters for REST v2 API using JSON

当我查看将参数传递给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 Client Error:Bad Request"。我真的可以使用python代码的确切示例来生成所需的"参数"参数,例如"my_parameter_1 ="test_value_1"。

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

1
2
3
4
5
6
7
    {
      'outputFormat': 'pdf',
      'parameters': [{'name': 'ReportID', 'value': ['my_value_1']}],
      'async': 'true',
      'pages': '',
      'interactive': 'false'
    }

斯塔加特的好工作。我现在明白了。因为我没有最大限度地阅读审查,我浪费了一些额外的时间。因此,感兴趣的编码器不仅被建议知道嵌套的,语法上有趣的reportParameter-property,而且特别是内部的value-property是一个数组。我想在这里可以通过某种形式的列表/数组/集合?

令我恼火的是,如果我应该构建一个以上的"reportParameter"属性,但这根本就是无稽之谈
JSON语法是否允许对象中的重复键。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{
   "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沟通。帮自己一个忙,并使用PHP的请求而不是纯粹的CURL。它甚至有内部使用套接字而不是CURL的后备,当后者不可用时。

为你Staggart Upvote。


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

1
2
3
4
5
   "parameters":{
        "reportParameter":[
             {"name":"my_parameter_1","value":["my_value_1"]}
          ]
     }

要特别注意多个"reportParameter"。


这是一个适合我的例子。我使用的是Python 2.7,以及Jaspersoft的社区版。与上面的C#示例一样,此示例也使用了其余的v2,这使我很容易快速下载pdf报告

1
2
3
4
5
6
7
8
9
10
11
12
13
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)

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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;
}