Метод angular2 http.post выдает исключение typeerror {}

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

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

person AishApp    schedule 28.01.2016    source источник


Ответы (2)


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

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 использует наблюдаемые объекты под капотом. Они также нацелены на асинхронную обработку.

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

Надеюсь, это поможет вам, Тьерри.

person Thierry Templier    schedule 28.01.2016
comment
Спасибо @Thierry за ваш ответ. Я передал параметры через обратный вызов переменной в моем методе POST. let callback = oauth_callback=localhost/callback; Извините, что я пропустил это в своем предыдущем коде. Я не обнаружил свои ошибки во втором параметре метода подписки. Вот почему я включил try catch. Может быть, я попробую исключить обещания. - person AishApp; 29.01.2016
comment
Я попытался удалить обещание, и я столкнулся с проблемой. Причина проблемы в том, что http не определен. Я также включил @Injectable, но проблема остается прежней. Пожалуйста помоги - person AishApp; 29.01.2016
comment
Вы добавили HTTP_PROVIDERS во второй параметр функции bootstrap? - person Thierry Templier; 29.01.2016
comment
Большое спасибо. Я могу попасть внутрь функции :) - person AishApp; 29.01.2016

Я обнаружил, что застрял даже после выполнения всех вышеперечисленных шагов. Полное решение выглядит следующим образом. Удалите блок try catch и пообещайте, как предложил Тьерри. Используйте внедрение зависимостей для 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);
}
person AishApp    schedule 01.02.2016
comment
Почему бы вам не ввести Http из конструктора? Это можно сделать при регистрации HTTP_PROVIDERS в функции bootstrap или в компонентах, использующих объект http. Таким образом, вам не нужно явно ссылаться на Injector... - person Thierry Templier; 01.02.2016
comment
Я создаю библиотеку anguar2 для своего приложения ionic2. Поскольку это действует как служба, Http, введенный в конструктор, не работает. Он остается неопределенным. Это причина ошибки в моем коде. Когда я ввожу инжектором, он работает нормально. - person AishApp; 01.02.2016
comment
Вы добавили декоратор @Injectable в свой сервис? - person Thierry Templier; 01.02.2016
comment
Да. Но это не сработало. Также я попытался использовать @Inject(HTTP) http: Http в своем конструкторе. Я понятия не имею, почему это не сработало. - person AishApp; 01.02.2016
comment
Я должен ;-) Вы использовали это: bootstrap(AppComponent, [ HTTP_PROVIDERS ]);? - person Thierry Templier; 01.02.2016
comment
Хорошо, я вижу. Вы должны объявить поставщиков HTTP в атрибуте providers вашего компонента приложения. См. эти ссылки: stackoverflow.com/questions/34760422/ и github.com/barbatus/ionic2-meteor/blob/master/bootstrap.ts#L39. Я думаю, что первого достаточно... Если вы хотите получить более подробную информацию о том, как работают иерархические инжекторы Angular2, вы можете взглянуть на этот ответ: stackoverflow.com/questions/34804298/ - person Thierry Templier; 01.02.2016