2016-05-11 37 views
2

我一直在用Ionic 2實現一個POST調用ASP.NET API,我掙扎了一番。我在一個有用的指南的幫助下管理了一個GET,但是我真的找不到任何東西類似的POST,直到我遇到一個YouTube視頻。與視頻的幫助下,我有這個方法在我的供應商:用Ionic 2 POST調用

backendlogin() { 
    if (this.data) { 
     return Promise.resolve(this.data); 
    } 

    return new Promise(resolve => { 
     var json = JSON.stringify({ email: '[email protected]', password: 'root' }); 
     var params = 'json=' + json; 
     var headers = new Headers(); 
     headers.append('Content-Type', 'application/json'); 

     this.http.post('http://insertipadresshere/api/login', 
      params, { 
       headers: headers 
      }) 
      .map(res => res.json()) 
      .subscribe(data => { 
       this.data = data; 
       resolve(this.data); 
      }, 
      error => alert(error), 
     () => console.log("Finished") 
    ); 
    }); 
} 

我GET方法基本上是由離子創建提供商時所提供。它們與這段代碼很相似,除了聲明變量的部分和附加的頭部外,還有http.get,而不是當然後的。

這是我使用從頁面控制器調用提供的函數功能:

setuplogin() { 
    this.backend.backendlogin() 
     .then(data => { 
      this.data = data; 
     }); 
    console.log(this.data); 
} 

現在到這個問題。如果我理解了所有事情,那麼backendLogin()應該顯示一個警告,如果出現錯誤,它會執行錯誤。警報顯示「[object Object]」。控制檯中唯一的東西是一個空的日誌,可能來自setupLogin(),因爲數據是空的。該API應採取電子郵件地址和密碼,並返回一個UID。任何人都可以將我指向正確的方向嗎?

return new Promise((resolve,reject) => { 
    var json = JSON.stringify({ email: '[email protected]', password: 'root'}); 
    var params = 'json=' + json; 
    var headers = new Headers(); 
    headers.append('Content-Type', 'application/json'); 

    this.http.post('http://insertipadresshere/api/login', 
     params, { 
      headers: headers 
     }) 
     .map(res => res.json()) 
     .subscribe(data => { 
      this.data = data; 
      resolve(this.data); 
     }, 
     error => reject(error), 
    () => console.log("Finished") 
); 
}); 

這麼說,我不認爲有必要創建一個原始的承諾:

回答

3

如果有錯誤我會拒絕的承諾。您可以利用觀測的toPromise方法:

var json = JSON.stringify({ email: '[email protected]', password: 'root'}); 
var params = 'json=' + json; 
var headers = new Headers(); 
headers.append('Content-Type', 'application/json'); 

return this.http.post('http://insertipadresshere/api/login', 
     params, { 
      headers: headers 
     }) 
     .map(res => res.json()) 
     .toPromise(); 
); 

得到錯誤

setuplogin() { 
    this.backend.backendlogin() 
    .then(data => { 
     this.data = data; 
     console.log(this.data); 
    }, error => { 
     // do something 
    }); 
} 

要完成,你可以直接使用可觀察到的,而不是返回一個承諾:

var json = JSON.stringify({ email: '[email protected]', password: 'root'}); 
var params = 'json=' + json; 
var headers = new Headers(); 
headers.append('Content-Type', 'application/json'); 

return this.http.post('http://insertipadresshere/api/login', 
     params, { 
      headers: headers 
     }) 
     .map(res => res.json()); 
); 

和訂閱上它在setupLogin方法:

setuplogin() { 
    this.backend.backendlogin() 
    .subscribe(data => { 
     this.data = data; 
     console.log(this.data); 
    }, 
setuplogin() { 
    this.backend.backendlogin() 
    .subscribe(data => { 
     this.data = data; 
     console.log(this.data); 
    }, error => { 
     // do something with error 
    }); 
} 
+0

不幸的是,沒有工作。你認爲這是API的問題嗎?我沒有爲自己編寫代碼,但我可以聯繫作者。 – Pharetra

+1

你能看到在開發工具,網絡選項卡中實際執行的請求嗎?可以幫忙看看它;-) –

+0

我可以,你需要什麼數據?我注意到有一個400錯誤的請求POST方法。 – Pharetra