ajax可以使用绝对网址吗?用于调用Web服务?

时间:2016-04-16 05:05:02

标签: javascript jquery ajax

大多数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");
      }

    }

  }

})();




2 个答案:

答案 0 :(得分:4)

  

ajax可以使用绝对网址'用于调用Web服务?

是的,如果接收服务器支持跨域方案,例如CORS或JSONP,并且您正在正确指定URL。

浏览器具有称为"相同原始保护的安全功能"。默认情况下,此保护允许您仅对完全相同的"来源#34;进行Ajax调用。与运行Javascript的网页(相同的协议,相同的域,相同的端口)是从。

加载的

这种相同的原始保护有两种方法。

  1. CORS - 跨域资源共享是一种方案,接收服务器通过该方案告知浏览器允许部分或全部跨源请求。如果服务器启用此类访问,则来自某个其他域的浏览器网页可能会对此服务进行Ajax调用。 CORS不仅仅是全部或全部,它具有许多功能,因此网站甚至可以仅启用某些类型的访问,或仅允许从某些其他站点访问。

  2. JSONP - 在CORS存在之前,网络世界提出了一种名为JSONP的有点虚伪的解决方法。在此方案中,浏览器从所需主机请求脚本文件(脚本文件不受相同的原始安全限制),然后主机服务器返回浏览器将执行的实际Javascript文件。如果操作正确,则执行的脚本可以将结果传回给调用者。 JSONP不是常规的Ajax调用,尽管一些Ajax库(如jQuery)允许您使用他们的Ajax接口,即使您正在进行JSONP请求。

  3. 代理 - 相同的原始限制只是浏览器中的一项功能,因此服务器可以无限制地联系其所需的任何域。解决相同原始限制的一种方法是让您自己的服务器(在您自己的域上与网页的域匹配)向您发出外部请求(例如代理请求)。您将Ajax调用发送到您自己的服务器,要求它为您提出代理请求。然后,您的服务器联系外部服务器,获取结果并将其作为Ajax响应返回给您。

  4. 如果您要求对以下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;