如何使用javascript创建跨域http获取请求?

时间:2011-10-04 10:18:50

标签: javascript cross-domain dynamics-crm crm dynamics-crm-2011

我正在尝试在Dynamics CRM 2011中实现短信功能。我为此创建了一个自定义活动,并在短信表单中添加了一个按钮。按下按钮时,应发送短信。

我需要为此发出一个http请求并传递一些参数。这是触发的代码:

function send() {
var mygetrequest = new ajaxRequest()
mygetrequest.onreadystatechange = function () {
    if (mygetrequest.readyState == 4) {
        if (mygetrequest.status == 200 || window.location.href.indexOf("http") == -1) {
            //document.getElementById("result").innerHTML = mygetrequest.responseText
            alert(mygetrequest.responseText);
        }
        else {
            alert("An error has occured making the request")
        }
    }
}
var nichandle = "MT-1234";
var hash = "md5";
var passphrase = "[encryptedpassphrase]";
var number = "32497123456";
var content = "testing sms service";

mygetrequest.open("GET", "http://api.smsaction.be/push/?nichandle=" + nichandle + "&hash=" + hash + "&passphrase=" + passphrase + "&number=" + number + "&content=" + content, true)
mygetrequest.send(null)
}

function ajaxRequest() {
    var activexmodes = ["Msxml2.XMLHTTP", "Microsoft.XMLHTTP"] //activeX versions to check for in IE
    if (window.ActiveXObject) { //Test for support for ActiveXObject in IE first (as XMLHttpRequest in IE7 is broken)
        for (var i = 0; i < activexmodes.length; i++) {
            try {
                return new ActiveXObject(activexmodes[i])
            }
            catch (e) {
                //suppress error
            }
        }
    }
    else if (window.XMLHttpRequest) // if Mozilla, Safari etc
        return new XMLHttpRequest()
    else
        return false
}

我在线上获得了“访问被拒绝错误”:

mygetrequest.open("GET", "http://api.smsaction.be/push/?nichandle=" ......

感谢任何帮助。

4 个答案:

答案 0 :(得分:4)

检索站点必须批准跨域AJAX请求。通常情况并非如此。

您应该联系smsaction.be或查看他们的常见问题解答,看看他们是否有任何实施。

通常JSONP用于跨域请求,这必须在两端实现。

解决此问题的一个好方法是使用您自己的网站作为代理。对您的脚本执行AJAX请求,并让它进行调用。在示例PHP中,您可以使用cURL

答案 1 :(得分:1)

我认为短信服务在不同的域中。如果是这样,您无法对其进行AJAX调用,因为它违反了相同的原始策略。基本上你有两个选择:

  1. 在服务器端进行短信发送
  2. 使用JSONP
  3. 此外,是否真的如此密码和其他秘密在HTML中可见?什么阻止人们窃取它并将其用于自己的目的?

答案 2 :(得分:1)

默认情况下,您的AJAX请求将因同源策略而失败。

http://en.wikipedia.org/wiki/Same_origin_policy

现代技术允许CORS(参见Nicholas的artilce)http://www.nczonline.net/blog/2010/05/25/cross-domain-ajax-with-cross-origin-resource-sharing/

jQuery的Ajax允许CORS。

另一种方法是获取内容并动态生成脚本元素并在head.firstchild上执行insertBefore(请参阅jQuery 1.6.4源代码行号:7833) 谷歌分析代码也做了类似的事情。你可能也想看看它。

干杯.. SREE

答案 3 :(得分:0)

对于您的示例,当从不同的域请求错误时:

  

XMLHttpRequest无法加载http://api.smsaction.be/push/?nichandle=??????&hash=?????&passphrase= [?????????? ??]&安培;数= ????????????&安培;含量= ???????????????。 Access-Control-Allow-Origin不允许原点http://server

对于跨域XMLHttp请求,目标服务器必须发送Access-Control-Allow-Origin响应头。

MDN:https://developer.mozilla.org/en/http_access_control