2016-12-21 2 views
0

ich es geschafft, ein $ http.post zu skyscannerAPI senden: http://partners.api.skyscanner.net/apiservices/pricing/v1.0 Allerdings bekomme ich die POST http://partners.api.skyscanner.net/apiservices/pricing/v1.0 405 (Method Not Allowed), ich durchsuchte Info jemand sagte, es vielleicht ist darauf zurückzuführen, ich bin mit Chrome, also habe ich die Erweiterung Allow-Control-Allow-Origin installiert, aber es zeigt immer noch den Fehler. Die vollständige Fehlermeldung zeigt, dass wie folgt aus:Angular Ionic POST 405 (Methode nicht erlaubt), mit Chrome

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 

Die (anonym) @ ionic.bundle.js: 25005 wird folgender Code:

xhr.send(isUndefined(post) ? null : post); 

Mein Code, wie folgend:

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

Antwort

0

Nach ein paar Stunden Recherche fand ich die Antwort. Ich muss meine Daten serialisieren, weil die Content-Type: 'application/x-www-form-urlencoded', was bedeutet, dass der Körper der HTTP-Nachricht an den Server gesendet wird, ist im Wesentlichen eine riesige Abfrage Zeichenfolge - Name/Wert-Paare werden durch das kaufmännische Und getrennt (&), und Namen getrennt werden Werte mit dem Gleichheitszeichen (=). Ein Beispiel hierfür wäre (Referenz https://stackoverflow.com/questions/4007969/application-x-www-form-urlencoded-or-multipart-form-data):

MyVariableOne=ValueOne&MyVariableTwo=ValueTwo 

wenn die Daten nicht serialisiert ist, sieht es so aus:

console.log(bodyInfo); 
//=> Object {apikey: "ds436195492025844505223424234232173", country: "CA", currency: "CAD", locale: "zh_Hans_CN", adults: 1…} 

Nachdem es serialisiert:

console.log(bodyInfoSerialied); 
    //=>apikey=ds436195492025844505223424234232173&country=CA&currency=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 

Dank Die answer Ich poste den bearbeiteten Code unten:

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

Beachten Sie, dass der Code immer noch etwas falsch ist, aber der Fehler 405 ist zumindest gelöst.

Verwandte Themen