需要使用 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 搜索帖子?
Wordpress REST API:如何在 WP REST API JSON 文件中获取“纯文字”内容?
使用 slashdb rest api 将 json 数据插入 MySQL 数据库