0

我正在使用 Pentaho 数据集成,我需要一个步骤来给我一个 http 请求的响应头。我真正需要的是 HTTP 调用的 HEAD 方法的实现,因为我必须在 Internet 上查看资源的最后修改字段。我尝试使用 REST Client 步骤,但它不起作用。所以我想写一个脚本来制作我需要的一切。我实际上创建了一个修改后的 Java 脚本值,并将这段代码放在里面:

var req = new XMLHttpRequest();
req.open('GET', 'URL', false);
req.send(null);
var headers = req.getAllResponseHeaders().toLowerCase();

当我运行它时,它不会给我任何错误,但“标题”中有任何内容。

有什么建议么?我会很感激一个不同的解决方案

4

3 回答 3

1

如果您请求的 URL在不同的域上,那么我可以告诉您服务器没有发送正确的标头以允许跨域资源共享。

Access-Control-Allow-Origin: *

如果没有服务器发送该标头,访问任何响应(包括标头)的唯一方法是您的脚本是否在同一域(和协议)上运行,或者如果您在自己的服务器上设置代理以从远程获取数据服务器。

如果我在此页面上打开 JS 控制台并运行:

var req = new XMLHttpRequest();
req.open('GET', 'http://dati.toscana.it/it/storage/f/2012-07-26T160139/intoscana-arte-e-cultura.csv', false);
req.send(null);
console.log(req.getAllResponseHeaders());

我得到以下输出:

XMLHttpRequest cannot load http://dati.toscana.it/it/storage/f/2012-07-26T160139/intoscana-arte-e-cultura.csv. Origin http://stackoverflow.com is not allowed by Access-Control-Allow-Origin.
NetworkError: A network error occurred.
于 2013-08-13T20:37:54.403 回答
0

但如果我最后发出警报:

var req = new XMLHttpRequest();
req.open('GET', 'http://dati.toscana.it/it/storage/f/2012-07-26T160139/intoscana-arte-e-cultura.csv', false);
req.send(null);
var headers = req.getAllResponseHeaders().toLowerCase();
alert(headers);

它给了我回应。它也给了我这个:

错误:失败

req.send(null);

我正在使用萤火虫。

于 2013-08-13T21:27:44.030 回答
0

我有一个类似的问题。在我的例子中是检测重定向,这可能发生在使用第三方存储的服务(如 Amazon S3)中。我第一次尝试使用 XMLHttpRequest 但显然它没有在 Kettle 中可用的 JavaScript 中实现,只是在浏览器中实现。为了解决这个问题,我按照http://type-exit.org/adventures-with-open-source-bi/2010/06/using-java-in-pentaho-kettle/的说明来引用另一个 Java 类,提到在http://www.mkyong.com/java/how-to-get-http-response-header-in-java/中,在修改后的 Javascript 值步骤中。限制是您需要执行主要请求才能获取标头,这不是“仅一个请求”的解决方案。

//Get the location of a link that has a 301 permanent redirection

var pathurl=documentourl; //URL to lookup. It must be a valid address, otherwise will give error
var location; //final location in case of redirect


//fake import of the Java Classes
var HTTPRequest=javax.servlet.http.HttpServletRequest;
var url=java.net.URL;

//open a url connection
var conn= new url(pathurl).openConnection();
//if you yant to watch all the headers uncomment the following lines 
//var headerobj= conn.getHeaderFields();

var status=conn.getResponseCode(); //get status code


if (status == 301){ //ie: permanent redirection
location=conn.getHeaderField("Location");
}
else{
//return the same url
location=pathurl;

}

我希望它对任何有这个问题的人有所帮助!

于 2015-05-02T18:07:16.927 回答