Angular Ionic POST 405(不允许的方法),使用 Chrome
Angular Ionic POST 405 (Method Not Allowed), using Chrome
我成功地向 skyscannerAPI 发送了 $http.post:http://partners.api.skyscanner.net/apiservices/pricing/v1.0
但是,我得到了 POST http://partners.api.skyscanner.net/apiservices/pricing/v1.0 405 (Method Not Allowed)
,我通过 Info 搜索有人说这可能是因为我正在使用 Chrome,所以我安装了扩展程序 Allow-Control-Allow-Origin,但它仍然显示错误.
完整的错误消息显示如下:
POST http://partners.api.skyscanner.net/apiservices/pricing/v1.0 405 (Method Not Allowed)
(anonymous) @ ionic.bundle.js:25005
sendReq @ ionic.bundle.js:24798
serverRequest @ ionic.bundle.js:24508
processQueue @ ionic.bundle.js:29132
(anonymous) @ ionic.bundle.js:29148
$eval @ ionic.bundle.js:30400
$digest @ ionic.bundle.js:30216
$apply @ ionic.bundle.js:30508
(anonymous) @ ionic.bundle.js:65428
defaultHandlerWrapper @ ionic.bundle.js:16792
eventHandler @ ionic.bundle.js:16780
triggerMouseEvent @ ionic.bundle.js:2953
tapClick @ ionic.bundle.js:2942
tapTouchEnd @ ionic.bundle.js:3069
(匿名)@ ionic.bundle.js:25005 的代码如下:
xhr.send(isUndefined(post) ? null : post);
我的代码如下:
//service.js
.service('skyscanner',function($http){
var baseUrl= "http://partners.api.skyscanner.net/apiservices/pricing/v1.0";
var bodyInfo= {
body: {
apikey: My_API_KEY,
Country: "CA",
Currency: "CAD",
//more data......
}
};
this.getKey= function(){
var require_sessionkey= $http({
method:"POST",
url:baseUrl,
data: bodyInfo,
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Accept' :'application/json'
}
})
.success(function successCallback() {
var polling={};
var session_key = require_sessionkey.headers["location"];
(function(){
polling=$http.get(session_key, {query: {apikey: My_API_KEY}});
})();
return polling;
}).error(function errorCallback() {
console.log("something gets wrong: "+ require_sessionkey);
});
};
})
//controller.js
.controller('FlightSearchCtrl',function($scope,skyscanner,FlightInfos){
$scope.list = [];
$scope.text = 'hello';
$scope.skyscannerPost= function(){
var polling=skyscanner.getKey();
$scope.polling=polling;
};
})
经过几个小时的研究,我找到了答案。
我需要序列化我的数据,因为 Content-Type: 'application/x-www-form-urlencoded'
,这意味着发送到服务器的 HTTP 消息的主体本质上是一个巨大的查询字符串——name/value 对由与号 (&) 分隔,名称和值之间用等号 (=) 分隔。这方面的一个例子是(参考 ):
MyVariableOne=ValueOne&MyVariableTwo=ValueTwo
如果数据没有序列化,看起来像:
console.log(bodyInfo);
//=> Object {apikey: "ds436195492025844505223424234232173", country: "CA", currency: "CAD", locale: "zh_Hans_CN", adults: 1…}
序列化后:
console.log(bodyInfoSerialied);
//=>apikey=ds436195492025844505223424234232173&country=CA¤cy=CAD&locale=zh_Hans_CN&adults=1&children=0&infants=0&originPlace=YVR&destinationPlace=SHA&outboundDate=2017-01-19&inboundDate=2017-01-23&locationSchema=Iata&cabinClass=Economy
感谢 answer
我 post 下面编辑的代码:
.service('skyscanner',function($http){
var baseUrl= "http://partners.api.skyscanner.net/apiservices/pricing/v1.0";
var bodyInfo= {
'apikey': 'ds43619549203213123211202173',
"country": "CA",
"currency": "CAD",
"locale": "zh_Hans_CN",
//...
};
//new added serialize().
serialize = function(obj, prefix) {
var str = [], p;
for(p in obj) {
if (obj.hasOwnProperty(p)) {
var k = prefix ? prefix + "[" + p + "]" : p, v = obj[p];
str.push((v !== null && typeof v === "object") ?
serialize(v, k) :
encodeURIComponent(k) + "=" + encodeURIComponent(v));
}
}
return str.join("&");
}
//serialize the body.
var bodyInfoSerialied = serialize(bodyInfo);
console.log(bodyInfo);
console.log(bodyInfoSerialied);
this.getKey= function(){
var require_sessionkey= $http({
method:"POST",
url:baseUrl,
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Accept' :'application/json'
},
data:bodyInfoSerialied
})
.success(function successCallback(require_sessionkey) {
console.log(require_sessionkey);
var polling={};
var session_key = require_sessionkey.headers["Location"];
(function(){
polling=$http.get(session_key, {query: {apikey: 'ds43619549203213123211202173'}});
})();
return polling;
}).error(function errorCallback(require_sessionkey) {
console.log("something gets wrong: "+ require_sessionkey);
console.log("bodyInfoSerialied: "+ bodyInfoSerialied);
});
};
})
请注意代码仍然有问题,但至少解决了 405 错误。
我成功地向 skyscannerAPI 发送了 $http.post:http://partners.api.skyscanner.net/apiservices/pricing/v1.0
但是,我得到了 POST http://partners.api.skyscanner.net/apiservices/pricing/v1.0 405 (Method Not Allowed)
,我通过 Info 搜索有人说这可能是因为我正在使用 Chrome,所以我安装了扩展程序 Allow-Control-Allow-Origin,但它仍然显示错误.
完整的错误消息显示如下:
POST http://partners.api.skyscanner.net/apiservices/pricing/v1.0 405 (Method Not Allowed)
(anonymous) @ ionic.bundle.js:25005
sendReq @ ionic.bundle.js:24798
serverRequest @ ionic.bundle.js:24508
processQueue @ ionic.bundle.js:29132
(anonymous) @ ionic.bundle.js:29148
$eval @ ionic.bundle.js:30400
$digest @ ionic.bundle.js:30216
$apply @ ionic.bundle.js:30508
(anonymous) @ ionic.bundle.js:65428
defaultHandlerWrapper @ ionic.bundle.js:16792
eventHandler @ ionic.bundle.js:16780
triggerMouseEvent @ ionic.bundle.js:2953
tapClick @ ionic.bundle.js:2942
tapTouchEnd @ ionic.bundle.js:3069
(匿名)@ ionic.bundle.js:25005 的代码如下:
xhr.send(isUndefined(post) ? null : post);
我的代码如下:
//service.js
.service('skyscanner',function($http){
var baseUrl= "http://partners.api.skyscanner.net/apiservices/pricing/v1.0";
var bodyInfo= {
body: {
apikey: My_API_KEY,
Country: "CA",
Currency: "CAD",
//more data......
}
};
this.getKey= function(){
var require_sessionkey= $http({
method:"POST",
url:baseUrl,
data: bodyInfo,
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Accept' :'application/json'
}
})
.success(function successCallback() {
var polling={};
var session_key = require_sessionkey.headers["location"];
(function(){
polling=$http.get(session_key, {query: {apikey: My_API_KEY}});
})();
return polling;
}).error(function errorCallback() {
console.log("something gets wrong: "+ require_sessionkey);
});
};
})
//controller.js
.controller('FlightSearchCtrl',function($scope,skyscanner,FlightInfos){
$scope.list = [];
$scope.text = 'hello';
$scope.skyscannerPost= function(){
var polling=skyscanner.getKey();
$scope.polling=polling;
};
})
经过几个小时的研究,我找到了答案。
我需要序列化我的数据,因为 Content-Type: 'application/x-www-form-urlencoded'
,这意味着发送到服务器的 HTTP 消息的主体本质上是一个巨大的查询字符串——name/value 对由与号 (&) 分隔,名称和值之间用等号 (=) 分隔。这方面的一个例子是(参考 ):
MyVariableOne=ValueOne&MyVariableTwo=ValueTwo
如果数据没有序列化,看起来像:
console.log(bodyInfo);
//=> Object {apikey: "ds436195492025844505223424234232173", country: "CA", currency: "CAD", locale: "zh_Hans_CN", adults: 1…}
序列化后:
console.log(bodyInfoSerialied);
//=>apikey=ds436195492025844505223424234232173&country=CA¤cy=CAD&locale=zh_Hans_CN&adults=1&children=0&infants=0&originPlace=YVR&destinationPlace=SHA&outboundDate=2017-01-19&inboundDate=2017-01-23&locationSchema=Iata&cabinClass=Economy
感谢 answer 我 post 下面编辑的代码:
.service('skyscanner',function($http){
var baseUrl= "http://partners.api.skyscanner.net/apiservices/pricing/v1.0";
var bodyInfo= {
'apikey': 'ds43619549203213123211202173',
"country": "CA",
"currency": "CAD",
"locale": "zh_Hans_CN",
//...
};
//new added serialize().
serialize = function(obj, prefix) {
var str = [], p;
for(p in obj) {
if (obj.hasOwnProperty(p)) {
var k = prefix ? prefix + "[" + p + "]" : p, v = obj[p];
str.push((v !== null && typeof v === "object") ?
serialize(v, k) :
encodeURIComponent(k) + "=" + encodeURIComponent(v));
}
}
return str.join("&");
}
//serialize the body.
var bodyInfoSerialied = serialize(bodyInfo);
console.log(bodyInfo);
console.log(bodyInfoSerialied);
this.getKey= function(){
var require_sessionkey= $http({
method:"POST",
url:baseUrl,
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Accept' :'application/json'
},
data:bodyInfoSerialied
})
.success(function successCallback(require_sessionkey) {
console.log(require_sessionkey);
var polling={};
var session_key = require_sessionkey.headers["Location"];
(function(){
polling=$http.get(session_key, {query: {apikey: 'ds43619549203213123211202173'}});
})();
return polling;
}).error(function errorCallback(require_sessionkey) {
console.log("something gets wrong: "+ require_sessionkey);
console.log("bodyInfoSerialied: "+ bodyInfoSerialied);
});
};
})
请注意代码仍然有问题,但至少解决了 405 错误。