2013-06-21 89 views
0

我发誓,这是早期的工作,休息了一下,现在其又坏了......

我建立一个连接到一个自定义的公共REST API的应用程序AngularJS我使用Salesforce创建。我已经通过curl和apigee.com测试了REST api,并且正在正确地返回数据。当我尝试通过Angulars $ http.jsonp()方法调用相同的端点时,会发生此问题。根据Chromes Network的监测,当我尝试这样做时,请求被取消。

角厂:

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); 
    } 
} 

对于我的生活,我无法弄清楚为什么这不工作......任何想法?

+0

很难说了。那么,jsonp调用是否会转到您控制的终结点,或者它是否无法控制?你的代码中的一个'奇怪'的事情是你为http调用创建了一个延迟对象。你实际上不必这样做,因为$ http本身返回一个承诺 – Narretz

+0

我创建了一个延迟对象,所以我可以在将结果注入到任何控制器之前对服务中的数据进行过滤。 – jonnybro

回答

1

原因是因为Salesforce REST服务是从Sandbox而不是Production提供的,Chrome因为证书名称不匹配错误而自动取消请求。

从Salesforce的网站实施指南:

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