【问题标题】:$http.jsonp requests are gettings canceled$http.jsonp 请求被取消
【发布时间】:2013-06-18 08:11:19
【问题描述】:

我发誓这之前可以正常工作,休息一下,现在它又不能正常工作了......

我正在构建一个 AngularJS 应用程序,该应用程序连接到我使用 Salesforce 创建的自定义公共 REST api。我已经通过 curl 和 apigee.com 测试了 REST api,并且数据正在正确返回。当我尝试通过 Angulars $http.jsonp() 方法调用同一个端点时,就会出现问题。根据 Chromes 网络监视器,当我尝试执行此操作时,请求被取消。

Angular 工厂:

angular.module('SalesforceService', [], function($provide){

    $provide.factory('$salesforce', function($http, $q){

        return {
            login: function(email, password){

                var endpoint  = 'https://merchant.dev1.cs15.force.com/freelance/services/apexrest/FreelanceService?name=Jonathan&callback=JSON_CALLBACK';
                var deferred = $q.defer();

                console.log('...calling salesforce...');
                $http.jsonp(endpoint)               
                .success(function(data){
                    console.log('--SALESFORCE RESPONSE:');
                    console.log(data);

                    deferred.resolve(data);
                }).error(function(data, status, headers, config){
                    console.log('---SALESFORCE ERROR:');
                    console.log(data);
                    console.log(status);
                    console.log(headers());
                    console.log(config);

                    deferred.reject('An error occurred when attempting to login.');
                });

                return deferred.promise;
            }
        };

    });

})

然后我通过 $salesforce.login() 在我的一个控制器中调用此服务...

自定义 Salesforce REST 类:

@RestResource(urlMapping='/FreelanceService')
global class FreelanceService 
{
    global class TestObject{
        public String message;

        public TestObject(String message){
            this.message = message;
        }
    }

    @HttpGet
    global static void goGet()
    {
        String name = RestContext.request.params.get('name');

        TestObject o = new TestObject('Hello ' + name);

        RestContext.response.addHeader('Content-Type', 'application/json');
        RestContext.response.responseBody = formatResponse(o);
    }

    public static blob formatResponse(TestObject obj)
    {
        //instantiate string to be returned
        String response;

        //get callback parameter from url
        String callback = RestContext.request.params.get('callback');

        //return JSON wrapped in function if a callback parameter exists
        if(callback!=null)
        {
            response = callback + '('+JSON.serialize(obj)+')';
        }
        else
        {
            response = JSON.serialize(obj);
        }

        return blob.valueOf(response);
    }
}

对于我的一生,我无法弄清楚为什么这不起作用...有什么想法吗?

【问题讨论】:

  • 很难说。那么 jsonp 调用是转到您控制的端点还是超出您的控制范围?您的代码中的一件“奇怪”事情是您为 http 调用创建了一个延迟对象。您实际上不必这样做,因为 $http 本身会返回一个承诺
  • 我创建了一个延迟对象,以便在将结果注入任何控制器之前对服务中的数据进行过滤。

标签: javascript angularjs salesforce jsonp apex-code


【解决方案1】:

事实证明,由于 Salesforce REST 服务是从沙盒而不是生产环境提供的,Chrome 会因为证书名称不匹配错误而自动取消请求。

来自 Salesforce 站点实施指南:

只有生产组织拥有有效的secure.force.com SSL 使用 HTTPS 访问站点的证书。注意:如果一个站点在一个 沙盒(非生产)组织使用 HTTPS 访问,一个 可能会出现证书名称不匹配警告

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-23
    • 2011-01-28
    • 2022-10-24
    • 2018-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多