【发布时间】:2015-10-27 12:00:54
【问题描述】:
我有像
一样发送 csv 字符串的 Rest API"aa,bb\n cc,dd"
这里是休息服务代码:
@GET
@Path("/getCsv")
@Produces({"text/csv"})
public String getCSV( ) {
return "aa,ba,\n,ac,da";
}
在用户界面方面
获取请求代码的Angular资源代码如下:
angular.module('csvHelper', ['ngResource','configuration']).factory('csvHelper', function($resource,$rootScope){
return $resource(URL+'/api/getCsv/', {}, {
query: {method:'GET', params:{}, cache :true}
});
});
发出get请求并生成csv的代码如下
csvHelper.query({}, function(response) {
def.resolve(response);
},function(response) {
def.reject(response);
});
var prom = def.promise;
prom.then(function(text) {
$window.open("data:text/csv;charset=utf-8," + encodeURIComponent(text));
}, function(error) {
console.log('promise failed', error);
});
在网络选项卡中,我看到其余 API 正确发送数据:
"aa,ba,\n,ac,da"
但是当我下载 csv 文件时,我看到里面有
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
我做错了什么。
编辑
我厌倦了在控制台上打印响应,这就是我所看到的:
[e { 0="a", $get=function(), $save=function(), more...}, e { 0="a", $get=function(), $save=function(), more...}, e { 0=",", $get=function(), $save=function(), more...}, e { 0="b", $get=function(), $save=function(), more...}, e { 0="a", $get=function(), $save=function(), more...}, e { 0=",", $get=function(), $save=function(), more...}, e { 0="\n", $get=function(), $save=function(), more...}, e { 0=",", $get=function(), $save=function(), more...}, e { 0="a", $get=function(), $save=function(), more...}, e { 0="c", $get=function(), $save=function(), more...}, e { 0=",", $get=function(), $save=function(), more...}, e { 0="d", $get=function(), $save=function(), more...}, e { 0="a", $get=function(), $save=function(), more...}]
编辑 2
我将逻辑更改为像这样使用 $http:
$http.get("http://myurl.com/api/getcsv")
.success(function (response) {console.log(success)});
我在控制台上看到了成功,但没有看到弹出窗口。
当我在浏览器中点击http://myurl.com/api/getcsv 时,我看到弹出下载文件的窗口。
我错过了什么
编辑 3
这个改变奏效了。
$http.get(compiledUrl).then(function (response) {
$window.open("data:text/csv;charset=utf-8," + encodeURIComponent(response.data));
},function(response){
console.log("error");
});
【问题讨论】:
-
看来你需要
JSON.stringify(text)。您还应该使用encodeURI()而不是 encodeURIComponent() -
是的,试试 encodeURI。似乎不需要 JSON.stringify 因为您要返回文本。
-
不是 Json 数据。如何使用 JSON.stringify?
-
参考第二条评论
-
因此,出于某种原因,您没有返回纯字符串。尝试更改生产注释,使其返回@Produces({"text/plain"})。目标是让您的响应成为一个字符串。
标签: javascript java angularjs csv servlets