Javascript $http.jsonp请求已取消
我发誓这是工作较早,休息了一下,现在它不再工作 我正在构建一个AngularJS应用程序,它连接到我与Salesforce一起创建的自定义公共RESTAPI。我已经通过curl和apigee.com测试了RESTAPI,数据返回正确。当我试图通过Angulars$http.jsonp()方法调用同一个端点时,就会出现问题。根据Chromes网络监视器,当我尝试这样做时,请求被取消 角度工厂:Javascript $http.jsonp请求已取消,javascript,angularjs,salesforce,jsonp,apex-code,Javascript,Angularjs,Salesforce,Jsonp,Apex Code,我发誓这是工作较早,休息了一下,现在它不再工作 我正在构建一个AngularJS应用程序,它连接到我与Salesforce一起创建的自定义公共RESTAPI。我已经通过curl和apigee.com测试了RESTAPI,数据返回正确。当我试图通过Angulars$http.jsonp()方法调用同一个端点时,就会出现问题。根据Chromes网络监视器,当我尝试这样做时,请求被取消 角度工厂: angular.module('SalesforceService', [], function($pr
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;
}
};
});
})
@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);
}
}
然后,我通过$salesforce.login()在我的一个控制器中调用此服务
定制Salesforce REST类:
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;
}
};
});
})
@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);
}
}
就我的一生而言,我不明白为什么这不起作用。。。有什么想法吗?结果表明,由于Salesforce REST服务是从沙箱而不是生产环境中提供的,Chrome会因为证书名称不匹配错误而自动取消请求 从Salesforce网站实施指南: 只有生产组织具有有效的secure.force.com SSL 使用HTTPS访问站点的证书。注:如果站点位于 沙箱(非生产)组织使用HTTPS访问,一种 可能会出现证书名称不匹配警告
很难说。那么jsonp调用是指向您控制的端点,还是超出您的控制范围?代码中一个“奇怪”的地方是,为http调用创建了一个延迟对象。实际上,您不必这样做,因为$http本身会返回promiseI创建的延迟对象,这样我就可以在将结果注入任何控制器之前对服务中的数据进行过滤。