2016-07-13 33 views
6

Per il mio ionic.config.json ho:I proxy Ionic2 non funzionano con ionic run ma funzionano con ionic serve?

{ 
    "name": "TSICMobile", 
    "app_id": "6e4680fa", 
    "typescript": true, 
    "v2": true, 
    "proxies": [ 
    { 
     "path": "/api", 
     "proxyUrl": "http://192.168.0.105:8081/api" 
    } 
    ] 
} 

Nel mio fornitore (user-data.ts, sulla base di Ionic2 conferenza app) che ho per esempio:

login(credentials) { 
    return new Promise((resolve, reject) => { 
     this.http.post(
      '/api/Login', 
      JSON.stringify(credentials), 
      { headers: this.contentHeader } 
     ).subscribe(res => { 
      console.log('api/Login return'); 
      this.data = res.json(); 
      if (this.data.authenticated === true) { 
       this.storage.set('TSIC_USER_PROFILE', JSON.stringify(this.data.tsiC_USER_PROFILE)); 
       this.storage.set('TSIC_USER_ROLES', JSON.stringify(this.data.listRoles)); 
       this.storage.set('tsic_id_token', this.data.token); 
       this.events.publish('user:login'); 
       resolve(true); 
      } else { 
       reject('not authenticated'); 
      } 
     }, error => { 
      console.log('api/Login failed'); 
      reject(error); 
     }); 
    }); 
} 

durante l'esecuzione:

ionic serve --lab -c 

la il proxy funziona perfettamente e invia messaggi a http://192.168.0.105:8081/api/Login

durante l'esecuzione

ionic run android -c 

post url è file://api/Login, e, ovviamente, non riesce.

Hai bisogno di assistenza per capire perché (apparentemente), il proxy non ha effetto quando si esegue sul dispositivo e cosa potrei fare storto o non capire.

+0

risposto alla mia domanda, "proxy", in base alla documentazione ionico si applica solo in ambiente "serve" (test del browser). –

+0

Sai se esiste un'altra soluzione per utilizzare un server proxy sul dispositivo? – error1337

+0

@ToddGreenwald anche io ho avuto lo stesso problema. hai trovato qualche soluzione per quello? – Sethu

risposta

1

Non è necessario un proxy quando si è sul dispositivo perché ionico può gestire il cors lì. È necessario il proxy sul servizio perché il browser sta tentando di gestire il CORS e il suo più severo con esso.

Quello che ti suggerisco di fare è controllare se esiste window.cordova e se usa l'url normale e altrimenti l'url del proxy.

Ti piace questa:

login(credentials) { 
     return new Promise((resolve, reject) => { 
      this.http.post(
       window.cordova?:'http://192.168.0.105:8081/api/Login':'/api/Login':, 
       JSON.stringify(credentials), 
       { headers: this.contentHeader } 
      ).subscribe(res => { 
       console.log('api/Login return'); 
       this.data = res.json(); 
       if (this.data.authenticated === true) { 
        this.storage.set('TSIC_USER_PROFILE', JSON.stringify(this.data.tsiC_USER_PROFILE)); 
        this.storage.set('TSIC_USER_ROLES', JSON.stringify(this.data.listRoles)); 
        this.storage.set('tsic_id_token', this.data.token); 
        this.events.publish('user:login'); 
        resolve(true); 
       } else { 
        reject('not authenticated'); 
       } 
      }, error => { 
       console.log('api/Login failed'); 
       reject(error); 
      }); 
     }); 
    } 
+0

la soluzione migliore sarebbe switch proxy durante la fase di compilazione invece della fase di runtime, ma per ora, non riesco ancora a capire come, qualsiasi aggiornamento? – fifth

+0

La soluzione migliore sarebbe utilizzare le variabili di ambiente http://developmentnow.com/2016/07/13/webpack-injecting-server-urls/ – misha130

0

risposta breve è il proxy è davvero utile solo per ionica servire. Per eseguire ionico è necessario utilizzare Cordova-plugin-whitelist

https://cordova.apache.org/docs/en/latest/reference/cordova-plugin-whitelist/

Che cosa questo significa per voi è però, dovrete scambiare i tuoi URI durante la compilazione. Quindi invece di just/api/myAwesomeService avrai effettivamente http://192.168.0.105:8081/api come tuo URI quando sei in esecuzione su un dispositivo reale.