如何使一个跨域HTTP请求使用JavaScript?

问题描述:

我试图在Dynamics CRM 2011中实现SMS功能。我为此创建了一个自定义活动,并将一个按钮添加到SMS的形式。当按下按钮时,应该发送短信。如何使一个跨域HTTP请求使用JavaScript?

我需要为此做一个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=" ...... 

任何帮助表示赞赏。

+3

我不会用这种方法解决这个要求。插件/自定义工作流活动是更合适的恕我直言。 – ccellar

我想SMS服务是在不同的域。如果是这样,您不能对其进行AJAX调用,因为它违反了同一个原产地策略。基本上,你有两个选择:

  1. 做短信发送服务器端
  2. 使用JSONP

而且,是不是真的,这样的密码和其他秘密HTML是可见的?什么阻止人们窃取它并将其用于他们自己的目的?

+0

pasphrase = md5(“password”+“numberOfreceiver”)我也认为这不是很安全..但是如果我在服务器站点上发送,源代码将不可见。我认为如果有人在您的网络上使用嗅探工具,它只会“可见”。 – ThdK

为了您例如,来自不同领域的错误请求时是:

的XMLHttpRequest无法加载HTTP://api.smsaction.be/push/ nichandle = ?????? & hash = ????? &密码短语= [0127]配对号码= ????????? & content = ???????????????。 Access-Control-Allow-Origin不允许原产地http://server

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

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

的检索网站有权批准跨域AJAX请求。通常情况并非如此。

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

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

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

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

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

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

jQuery的阿贾克斯允许CORS。

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

干杯.. sree