2016-01-28 2 views
3

Я попытался изменить существующую библиотеку angularjs на angular2 для моей потребности. Метод http.post в приведенном ниже коде бросает TypeError {} в качестве исключения. Кто-то, пожалуйста, помогите, поскольку я застрял на этом.angular2 http.post method throws typeerror {} exception

login() { 
    return new Promise((resolve, reject) => { 
    if(typeof jsSHA !== "undefined") { 
     var signatureObj = (new OauthUtility()).createSignature("POST", this.magentoOptions.baseUrl+"/oauth/initiate", this.oauthObject, {oauth_callback: "http://localhost/callback"}, this.magentoOptions.clientSecret, null);         
     let headersInitiate = new Headers(); 
     headersInitiate.append('Authorization',signatureObj.authorization_header); 
     headersInitiate.append('Content-Type','application/x-www-form-urlencoded'); 
     let url = this.magentoOptions.baseUrl + "/oauth/initiate"; 
     let callback = "oauth_callback=http://localhost/callback"; 

     try{ 
     this.http.post(url, callback,{headers: headersInitiate}) 
     .subscribe(
      (result) => { 
      console.log("i am inside"); 
      var rParameters = (result).split("&"); 
          ..... 
     } 
     catch(Exception){ 
     console.log(Exception) 
     } 

ответ

1

Вы должны попробовать что-то вроде этого:

var signatureObj = (new OauthUtility()).createSignature("POST", 
    this.magentoOptions.baseUrl+"/oauth/initiate", this.oauthObject, 
    {oauth_callback: "http://localhost/callback"}, 
    this.magentoOptions.clientSecret, null); let headersInitiate = new Headers(); 

headersInitiate.append('Authorization', 
      signatureObj.authorization_header); 
headersInitiate.append('Content-Type', 
      'application/x-www-form-urlencoded'); 
let url = this.magentoOptions.baseUrl + "/oauth/initiate"; 

let payload = ' ... '; 
this.http.post(url, payload,{headers: headersInitiate}) 
    .subscribe(
     (result) => { 
     console.log("i am inside"); 
     var rParameters = (result).split("&"); 
     (...) 
     }); 

Вот комментарии, я бы на вашем коде:

  • Второй параметр метода post должен быть строка, соответствующая к полезной нагрузке, а не к обратному вызову. Я вижу из ваших заголовков, что вы хотите отправить url-кодированную форму, поэтому вам нужно создать ее самостоятельно
  • try catch не требуется, так как выполнение HTTP является асинхронным, и ошибки могут быть «пойманы» во втором параметре (другой обратный вызов) метода subscribe.
  • Вам совсем не нужно обещать. Для HTTP, Angular2 использует наблюдаемые под капотом. Они также нацелены на асинхронную обработку.

После установки всего этого, я думаю, что вы не будете иметь ошибок больше ...

Надеется, что это помогает вам, Тьерри

+0

Спасибо @Thierry за ваш ответ. Я прошел параметры через переменный обратный вызов в моем методе POST. let callback = "oauth_callback = http: // localhost/callback"; Извините, что я пропустил его в своем предыдущем коде. Я не получил свои ошибки, обнаруженные во втором параметре метода подписки. Вот почему я включил try catch. Возможно, я попробую исключить обещания. – AishApp

+0

Я попытался удалить обещание, и я столкнулся с проблемой. Причина этого вопроса: http не определен. Я включил @Injectable, но проблема остается такой же. Помогите – AishApp

+0

Вы добавили 'HTTP_PROVIDERS' во второй параметр функции' bootstrap'? –

0

я нашел застряла даже после того, как приступить выше все шаги. Полное решение заключается в следующем. Удалите блок catch try и обещайте, как предложил Тьерри. Используйте зависимой инъекции http внутри конструктора, чтобы определить http.

import {Http,HTTP_PROVIDERS,Headers} from 'angular2/http'; 
import {Injector} from "angular2/core"; 
constructor() { 

     var injector = Injector.resolveAndCreate([HTTP_PROVIDERS]); 
     this.http = injector.get(Http); 
} 
+0

Почему бы вам не вводить «Http» из конструктора? Это можно сделать при регистрации HTTP_PROVIDERS в функции 'bootstrap' или в компонентах, которые используют объект' http'. Таким образом, вам не нужно явно ссылаться на «Инжектор» ... –

+0

Я создаю библиотеку anguar2 для своего приложения ionic2. Поскольку это действует как служба, Http, введенный в конструктор, не работал. Он остается неопределенным. Это причина ошибки в моем коде. Когда я впрыскиваю инжектор, он отлично работает. – AishApp

+0

Вы добавили декоратор '@ Injectable' к вашему сервису? –