Javascript AngularJS服务发送Twilio短信

Javascript AngularJS服务发送Twilio短信,javascript,angularjs,Javascript,Angularjs,我一直在尝试创建一个AngularJS服务,该服务可以从控制器调用,并根据应用程序中的特定事件发送文本消息。实施基于以下内容,工作如下: 首先,我们有以下服务: function BusinessService($http) { this.twilioSMS = { sendMessage: function(to, from, body) { var accountSid = 'xxx'; var authToken = 'xxx'; v

我一直在尝试创建一个AngularJS服务,该服务可以从控制器调用,并根据应用程序中的特定事件发送文本消息。实施基于以下内容,工作如下:

首先,我们有以下服务:

function BusinessService($http) {

  this.twilioSMS = {

    sendMessage: function(to, from, body) {

      var accountSid = 'xxx';
      var authToken = 'xxx';

      var testEndpoint = 'https://api.twilio.com/2010-04-01/Accounts/' + accountSid + '/SMS/Messages.json';
      var liveEndpoint = 'https://api.twilio.com/2010-04-01/Accounts/' + accountSid + '/Messages.json';

      var data = {
        To: to,
        From: from,
        Body: body
      };

      $http({
        method: 'POST',
        url: testEndpoint,
        data: data,
        dataType: 'json',
        contentType: 'application/x-www-form-urlencoded',
        beforeSend: function(xhr) {
          xhr.setRequestHeader("Authorization",
            "Basic " + btoa(accountSid + ":" + authToken) // !
          );
        },
        success: function(data) {
          console.log("Got response: %o", data);
          if (typeof successCallback == 'function')
            successCallback(data);
        },
        error: function(jqXHR, textStatus, errorThrown) {
          console.log("Request failed: " + textStatus + ", " + errorThrown);
          if (typeof failCallback == 'function')
            failCallback(jqXHR, textStatus, errorThrown);
        }
      })

    }

  }

}
然后在控制器中进行设置:

function ConsumerBusinessProfileCtrl($scope, BusinessService) {

  $scope.sendMessage = function(to, from, body) {
    return BusinessService.twilioSMS.sendMessage(to, from, body)
  }

}
然后从视图中调用它:

<a ng-click="sendMessage('+12345678901', '+15005550006', 'Hey Jenny! Good luck on the bar exam!')">Send Message</a>

使用我的帐户SID、authToken和电话号码,它工作正常。但是我的实现失败了,出现了
401(未经授权)
错误。我的一部分人认为这是因为
$http
不支持
发送前
发送后
。但我不确定?这里有人能给我指引正确的方向吗?

将$http更改为以下内容以解决问题:

 $http({
  method: 'POST',
  url: testEndpoint,
  data: data,
  transformRequest: function(obj) {
    var str = [];
    for (var p in obj)
      str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
    return str.join("&");
  },
  headers: {
    'Authorization': 'Basic ' + btoa(accountSid + ':' + authToken),
    'Content-Type': 'application/x-www-form-urlencoded'
  },
}).success(function(response) {
  console.log(response);
}).error(function(error) {
  console.log(error);
});
}

将$http更改为以下内容以修复问题:

 $http({
  method: 'POST',
  url: testEndpoint,
  data: data,
  transformRequest: function(obj) {
    var str = [];
    for (var p in obj)
      str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
    return str.join("&");
  },
  headers: {
    'Authorization': 'Basic ' + btoa(accountSid + ':' + authToken),
    'Content-Type': 'application/x-www-form-urlencoded'
  },
}).success(function(response) {
  console.log(response);
}).error(function(error) {
  console.log(error);
});
}

您是如何实现身份验证的。@RomanC身份验证在发送前
beforeSend
进行,使用
accountSid
authToken
变量,我在谷歌上搜索了一下,发现它实际上是一个jQuery不支持此功能,但建议使用拦截器。遗憾的是,我不太熟悉这个概念,也不太熟悉如何在我的例子中实现它。拦截器的概念太疯狂,没有代码,这是离题的。@RomanC很公平,我想这是可以理解的。在我的情况下,我还可以做些什么来实现身份验证?写一个代码并将其发布到问题“您是如何实现身份验证的”。@RomanC身份验证在发送前
使用
accountSid
authToken
变量进行,我在谷歌上搜索了一下,发现实际上jQuery并不支持这一点,但建议使用拦截器。遗憾的是,我不太熟悉这个概念,也不太熟悉如何在我的例子中实现它。拦截器的概念太疯狂,没有代码,这是离题的。@RomanC很公平,我想这是可以理解的。在我的案例中,我还可以做些什么来实现身份验证呢?写一个代码,并将其发布到问题中。我第一次遇到同样的问题是twilio集成。
transformRequest
让它为我工作。谢谢。我第一次遇到了同样的问题。
transformRequest
让它为我工作。谢谢