Моето ъглово обещание неочаквано преминава към обратно извикване на грешка, защо?

Имам клиент, работещ на Angular + typescript и съм съвсем нов в уеб разработката отпред.

Трябва да изпратя заявка за публикация до php API (който разработих). Заявката пристига правилно до сървъра и сървърът попълва тялото на отговора с правилните данни (аз го проверих сам при отстраняване на грешки в сървъра).

Проблемът е, че когато сървърът отговори, angular promise изпълнява обратно извикване за грешка и данните за отговора са празни. Когато проверявам изпратената заявка в браузъра, тя казва, че е отговорено със статус 200 OK, но има празно тяло.

Опитах се да извикам същата крайна точка на API със същите параметри чрез добавката за Firefox Api-requester и получавам отговора с правилното тяло... защо тогава моят Angular клиент не успява?

Следният кодов фрагмент съответства на моя контролер:

        vm.query = {
            'tx_filtre':'', 'idioma_filtre':'', 'tipus':'', 'id_dimfisica':'', 'tamPag':15, 'numPag':0
        };

        this.PropietatsService.getPropietats(vm.query)
            .then((response: ng.IHttpPromiseCallbackArg<string>) => {
                vm.objResult = JSON.parse(response.data);
                vm.propietats = vm.objResult.info;
                console.log('rebut', this.propietats);
            }, (response: ng.IHttpPromiseCallbackArg<string>) => {
                //always executes this error function, why????
                vm.objResult = JSON.parse(response.data);
            });

А това е съответният код за услугата:

getPropietats(query: any): ng.IPromise<ng.IHttpPromiseCallbackArg<string>> {
        var config = {
            headers : {
                'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8;'
            }
        };
        return this.$http.post("http://localhost:8080/diccionaris/propietat/get",JSON.stringify(query),config);
    }

P.S: също като странична бележка, по някаква причина сървърът ми не може да обработи заявката, ако задам заявката „Content-Type“ на „application/json“ в моя клиент. Това е причината да го задам на 'application/x-www-form-urlencoded'.

P.P.S: Знам, че боли, когато видите функция за получаване, извикана със заявка за публикация, но аз само следвах заповедите на шефа си...

Благодаря предварително!


person Driond    schedule 30.11.2016    source източник
comment
Сигурен ли си, че получаваш 200? Според документи обратното извикване за успех трябва да се извика за всеки код на състояние между 200-299   -  person Robin-Hoodie    schedule 30.11.2016
comment
Да, проверих го в Chrome DevTools в раздела Мрежа.   -  person Driond    schedule 30.11.2016


Отговори (3)


Задавате „Content-Type“: „application/x-www-form-urlencoded;charset=utf-8;“, но кодирате параметрите на заявката в JSON и след това се опитвате да декодирате отговор като JSON. Опитайте да зададете application/json или опитайте да премахнете JSON.encode параметри на заявка и да изпратите до публикуване на метод query. Ако това не помогне, регистрирайте грешката (в response) в обратното извикване на грешката и я вижте

person Antonio    schedule 30.11.2016

Ако сървърът не може да приеме application/json, тогава POST данните трябва да бъдат кодирани за application/x-www-form-urlencoded. За да направите това, използвайте https://docs.angularjs.org/api/ng/service/$httpParamSerializer:

getPropietats(query: any): ng.IPromise<ng.IHttpPromiseCallbackArg<string>> {
    var config = {
        headers : {
            'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8;'
        },
        transformRequest: $httpParamSerializer
    };
    return this.$http.post(url,query,config);
}
person georgeawg    schedule 30.11.2016

Най-накрая намерих решението: това беше проблем с CORS.

Пусках моя сървър и моя клиент в два различни локални порта, така че въпреки че сървърът обработи заявката (което няма много смисъл за мен), той не върна отговора, защото на клиента не беше позволен достъп до сървъра . За да се справя с това засега, добавих следния ред към моя сървър index.php:

header('Access-Control-Allow-Origin: *');

И сега работи добре.

person Driond    schedule 01.12.2016