需要示例:如何通过JSON传递Jasper Reports参数给REST v2 API
当我查看关于如何向Jasper Report REST 2 API传递参数的文档时,发现需要一个叫“parameters”的字典。链接中的示例展示了XML格式,但这并不太有用,因为不清楚对应的JSON应该是什么样子。我找到的最接近的资料在这个链接里。现在,我把这个字典的等效内容发送到服务器(还有我能想到的其他所有组合),但我仍然收到“400客户端错误:错误的请求”的回复。我真的需要一个确切的示例,来展示如何用Python代码生成所需的“parameters”参数,比如“my_parameter_1=‘test_value_1’”。
这是我当前的POST数据(为了简洁,省略了一些参数)。我知道这个是正确的,因为如果我省略“parameters”参数,报告就能正常工作:
{
'outputFormat': 'pdf',
'parameters': [{'name': 'ReportID', 'value': ['my_value_1']}],
'async': 'true',
'pages': '',
'interactive': 'false'
}
4 个回答
这里有一个完整的例子,展示了如何使用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;
}
这里有一个对我有效的例子。我使用的是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)
干得不错,Staggart。我明白了。因为我没有仔细阅读,所以浪费了一些额外的时间。因此,感兴趣的程序员不仅要注意嵌套的、语法上有趣的 reportParameter 属性,特别是里面的 value 属性是一个数组。我想这里可以传递某种形式的列表、数组或集合吧?
让我困惑的是,如果我应该构造多个 "reportParameter" 属性,但根据JSON语法是否允许对象中有重复的键来看,这样做是没有意义的。
所以为了记录一下,如何传递多个参数:
{
"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 作为备用。
给你点赞,Staggart。
好的,感谢 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" 的复数形式。