Ioni c angular http сообщение не работает на устройстве, но работает нормально в браузере - PullRequest
0 голосов
/ 17 апреля 2020

Я работаю над приложением ioni c - angular, и почтовый запрос работает нормально, когда тестируется в браузере с использованием ioni c, но при исключении на устройстве или эмуляторе Android запрос не работает.

Бэкэнд - это API для отдыха, использующий slim php и xampp на windows server

Ответ на запрос на устройстве android:

{"headers": {"normalizedNames": {}, "lazyUpdate": null, "headers": {}}, "status": 0, "statusText": "Unknown Error", "url": "http: //<>/ws_login.php/login","ok":false,"name":"HttpErrorResponse","message":"Http ответ об ошибке для http: // <> /ws_login.php/login: 0 неизвестно Ошибка "," ошибка ": {" isTrusted ": true}}

Мой код входа выглядит так:

import { Component, OnInit } from '@angular/core';
import { Router } from '@angular/router';
import { HttpClientModule, HttpClient, HttpHeaders } from '@angular/common/http';
import { AuthConstants } from '../config/auth-constants';
import { ToastService } from './../services/toast.service';
import { LoadingService } from './../services/loading.service';
import { StorageService } from './../services/storage.service';
import { environment } from '../../environments/environment';

@Component({
    selector: 'app-login',
    templateUrl: './login.page.html',
    styleUrls: ['./login.page.scss'],
})
export class LoginPage implements OnInit {
    data = {
        user : '',
        pass : ''
    }

    constructor(
        public http: HttpClient, 
        private router: Router, 
        private toastService: ToastService,
        private loadingService: LoadingService,
        private storageService: StorageService
    ) { }

    ngOnInit() {
        this.storageService.get(AuthConstants.AUTH).then(
            data => data?this.router.navigate(["home"]):null
        )
    }

    login() {
        var headers = new HttpHeaders();
        headers.append("Accept", 'application/json');
        headers.append('Content-Type', 'application/json' );
        const requestOptions = { headers: headers };

        if(this.data.user == "" || this.data.pass == "")
            return this.toastService.presentToast("Debe completar ambos campos", "danger");

        this.loadingService.showLoading("Iniciando sesión");
        console.log(environment.apiUrl+'ws_login.php/login');
        this.http.post(environment.apiUrl+'ws_login.php/login', this.data, requestOptions).subscribe(
            resp => {
                this.loadingService.hideLoading();
                if(resp){
                    if(resp['error'] == 1)
                        this.toastService.presentToast(resp['mensaje'], "danger");
                    else{
                        this.storageService.store(AuthConstants.AUTH, 1);
                        this.toastService.presentToast("Sesión iniciada con éxito", "success");
                        this.router.navigate(["home"]);
                    }
                }
                else
                    this.toastService.presentToast("Error de red", "danger");
            }, 
            error => {
                this.data.user = JSON.stringify(error);
                this.loadingService.hideLoading();
                this.toastService.presentToast("Error de red", "danger");
            }
        );/*
        console.log(AuthConstants.AUTH);
        AuthConstants.AUTH = {id: 1};*/
        //this.router.navigate(["home"]);
    }
}

Я также тестирую API с помощью приложения отдыха на устройстве и тот же URL-адрес отвечает без проблем.

Я добавил android: usedCleartextTraffic = "true" для androd manifest и не был решением.

Здесь mi ioni c info

Ionic:

   Ionic CLI                     : 6.3.0 (C:\Users\Manu\AppData\Roaming\npm\node_modules\@ionic\cli)
   Ionic Framework               : @ionic/angular 5.0.7
   @angular-devkit/build-angular : 0.803.26
   @angular-devkit/schematics    : 8.3.26
   @angular/cli                  : 8.3.26
   @ionic/angular-toolkit        : 2.2.0

Capacitor:

   Capacitor CLI   : 2.0.0
   @capacitor/core : 2.0.0

Utility:

   cordova-res : 0.11.0
   native-run  : 0.3.0

System:

   NodeJS : v12.16.1 (C:\Program Files\nodejs\node.exe)
   npm    : 6.13.4
   OS     : Windows 10

Спасибо!

Ответы [ 2 ]

1 голос
/ 17 апреля 2020

Поскольку ошибка говорит о том, что вы отправляете сообщение на http://<>/ws_login.php/login, я предполагаю, что в вашей переменной окружения apiUrl произошла ошибка при развертывании на мобильном устройстве. Если вы работаете с приложением на компьютере разработчика, для получения переменных понадобится environment.ts. Может быть, вы создаете приложение для своего телефона в производстве и, следовательно, не получаете правильные переменные среды (поскольку Ioni c затем использует environment.prod.ts?

0 голосов
/ 18 апреля 2020

Видимо angular httpClient имеет некоторые проблемы при выполнении на нативных устройствах и эмуляторах, мое решение было перенести запрос на ioni c native http.

Спасибо за помощь!

...