2013-06-21 111 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訪問,一個 證書名稱不匹配可能會出現警告