大多数javascript ajax教程/示例显示请求只能是相对路径,这意味着无法调用其他Web服务器。我想调用一个不包含在同一个应用程序中的Web服务,需要有一个绝对的url。当我打电话给http://192.168.1.62:8080/TRACER-REST-API/webapi/projects/16/releases/2/issues之类的东西时,ajax xhr调用类似于http:localhost:8080 / app / http://192.168.1.62:8080/TRACER-REST-API/webapi/projects/16/releases/2/issues
var XHR = null;
var $ajaxService = (function() {
function getXHRObject() {
var xmlHttpObject = null;
try {
//for old IE
xmlHttpObject = new ActiveXObject("Msxml2.XMLHTTP");
} catch (oldIEException) {
try {
// For IE 6.0+
xmlHttpObject = new ActiveXObject("Microsoft.XMLHTTP");
} catch (IESixPlusException) {
xmlHttpObject = false;
}
}
if (!xmlHttpObject && xmlHttpObject !== undefined) {
// firefox/chrome
xmlHttpObject = new XMLHttpRequest();
}
return xmlHttpObject;
}
return {
call: function makeServerCall(httpMethod, uri, isAsync, headers, postData, responseCallback) {
console.log(uri);
XHR = getXHRObject();
if (XHR != null) {
XHR.open(httpMethod, uri, isAsync);
if (headers != null) {
//XHR.setRequestHeader();
}
if (httpMethod === 'POST' && postData !== undefined) {
XHR.send(postData);
} else {
XHR.send();
}
XHR.onreadystatechange = responseHandler(responseCallback);
}
}
}
function responseHandler(callBack) {
if (XHR.readyState == 4) {
switch (XHR.state) {
case 200:
callBack();
break;
case 500:
throw new Error("Internal Server Error");
default:
throw new Error("Error occurred during server call");
}
}
}
})();

答案 0 :(得分:4)
ajax可以使用绝对网址'用于调用Web服务?
是的,如果接收服务器支持跨域方案,例如CORS或JSONP,并且您正在正确指定URL。
浏览器具有称为"相同原始保护的安全功能"。默认情况下,此保护允许您仅对完全相同的"来源#34;进行Ajax调用。与运行Javascript的网页(相同的协议,相同的域,相同的端口)是从。
加载的这种相同的原始保护有两种方法。
CORS - 跨域资源共享是一种方案,接收服务器通过该方案告知浏览器允许部分或全部跨源请求。如果服务器启用此类访问,则来自某个其他域的浏览器网页可能会对此服务进行Ajax调用。 CORS不仅仅是全部或全部,它具有许多功能,因此网站甚至可以仅启用某些类型的访问,或仅允许从某些其他站点访问。
JSONP - 在CORS存在之前,网络世界提出了一种名为JSONP的有点虚伪的解决方法。在此方案中,浏览器从所需主机请求脚本文件(脚本文件不受相同的原始安全限制),然后主机服务器返回浏览器将执行的实际Javascript文件。如果操作正确,则执行的脚本可以将结果传回给调用者。 JSONP不是常规的Ajax调用,尽管一些Ajax库(如jQuery)允许您使用他们的Ajax接口,即使您正在进行JSONP请求。
代理 - 相同的原始限制只是浏览器中的一项功能,因此服务器可以无限制地联系其所需的任何域。解决相同原始限制的一种方法是让您自己的服务器(在您自己的域上与网页的域匹配)向您发出外部请求(例如代理请求)。您将Ajax调用发送到您自己的服务器,要求它为您提出代理请求。然后,您的服务器联系外部服务器,获取结果并将其作为Ajax响应返回给您。
如果您要求对以下URL进行Ajax调用:
http://192.168.1.62:8080/TRACER-REST-API/webapi/projects/16/releases/2/issues
你看到实际使用的是什么
http:localhost:8080/app/http://192.168.1.62:8080/TRACER-REST-API/webapi/projects/16/releases/2/issues
然后您的代码可能出现问题,因为如果您的代码正确,浏览器将不会自行执行此操作。您可能需要向我们展示您的实际代码,以便查看代码出错的位置。如果正确指定,则支持绝对URI。
在Ajax代码中,您需要进行一些更改:
1)隐含全球。在此处添加var
,因此XHR
不是偶然的全局变量,因此,如果您一次只执行多个Ajax调用,则不会发生变量冲突:
var XHR = getXHRObject();
2)修复XHR.onreadystatechange 。改变这个:
XHR.onreadystatechange = responseHandler(responseCallback);
这样你就不会立即调用它,而是分配一个可以在以后调用的函数:
XHR.onreadystatechange = function() {
responseHandler(XHR, responseCallback);
}
然后,将额外的XHR参数添加到responseHandler()
实现中。
3)修复错误处理。您对throw
函数中的responseHandler()
没有任何好处。这是一个异步回调并执行throw
,只会涉及XMLHttpRequest基础结构的内容。它不会是一个例外,您可以用于任何有意义的事情。您可能需要重新构建代码,以便通过回调将错误传递给调用者。
4)使用已经测试过的Ajax库。在这个时代,我不知道你为什么要从头开始编写自己的Ajax包装器。有几千个已经可用的你可以从架子上复制,复制到你的项目中,而不必用你自己的代码来解决所有这些类型的问题。如果我个人还没有使用任何支持Ajax的框架,我可能会为新的fetch()
API获取polyfill并使用它,因为那是客户的未来 - 方面的Ajax,它是一个很好的干净的API。
答案 1 :(得分:1)
通过AJAX调用CURL脚本:
JQuery的:
$.ajax({
url: "assets/php/some_script.php",
type: 'GET',
path: //object to send to CURL request,
timeout: 1500,
cache: false,
error: function(a, b, c){
console.log("Error:", a, b, c);
},
success: function(data){
//work with your data here
}
});
PHP(即some_script.php):
$path = filter_input(INPUT_GET, 'path');
$url = /*Your absolute URL here*/ . $path
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$json = curl_exec($ch);
if ($error = curl_error($ch)) {
trigger_error("Failed to communicate with server: {$error}", E_USER_ERROR);
return;
}
curl_close($ch);
return $json;