2017-08-11 119 views
0

我有一個.net/C#的Web API 2.0 REST服務,它工作正常,如果有郵差的測試,但如果總是得到空參數從Angular2通話/ 4與郵政的http服務。Angular2/4 HTTP POST服務調用的.Net/MVC的Web API 2.0 REST參數爲空

下面

是代碼:

C#: 

public class UsersController : ApiController 
{ 
    // POST: api/users/login 
    public string login([FromBody]string value) 
    { 
     var ss = value; 
     return value; 
    } 
} 

Angular2服務:

login(email: string, password: string) { 
    const headers: Headers = new Headers(); 
    headers.append('Content-Type', 'application/json'); 
    const theBody = {'email': email, 'password': password}; 

    const requestoptions: RequestOptions = new RequestOptions({ 
     method: RequestMethod.Post, 
     url: this.host + '/users/login', 
     headers: headers, 
     body: JSON.stringify(theBody) 
    }) 

    return this.http.request(new Request(requestoptions)) 
     .map((res: Response) => { 
      return res.json; 
     }) 
     .catch(this.logAndPassOn); 
} 

當與郵差測試,我設置標頭,如內容類型:應用/ JSON和體選擇 「原始」。

一切看起來是一樣的,但是Angular2 HTTP POST服務不反正工作,我總是得到空值。

在此先感謝您的任何幫助。

+0

你在郵差中發送的JSON是什麼樣的? –

+0

你在組件或服務中獲得了零組件? –

+1

你使用'[HttpPost]'嗎? –

回答

0

刪除JSON.stringify:有沒有必要將其轉換爲一個字符串。

在網絡API的一面,你會爲傳入的數據是與POCO更好。創建一個類,它包含兩個字符串屬性,例如:

public class LoginViewModel 
{ 
    public string Email { get; set; } 
    public string Password { get; set; } 
} 

然後,切換到[FromBody]string value[FromBody]LoginViewModel viewModel

要嘗試和澄清多一點,有這樣一個很大的區別:這

{ 
    "email": "some-email", 
    "password": "some-password" 
} 

"{ email: 'some-email', password: 'some-password' }" 

第一個例子是一個JSON對象,而第二隻是一個字符串等等。不要緊,裏面的數據看起來像JSON:事實並非如此。在你的Postman例子中,你實際上是在發送一個字符串,但是Angular可能有點聰明,基本上忽略了你的JSON.stringify

+1

是的!刪除JSON.stringify並使用[FromBody] LoginViewModel viewModel的作品!但我很困惑,我把'Content-Type'設置爲'application/json',它應該是json字符串? 你能解釋一下是什麼原因? –

+0

'application/json'用於描述原始JSON對象,而不是序列化爲字符串的JSON對象。如果你真的想要一個字符串通過,你會想嘗試'text/plain',但我不會推薦這個。你真的需要它是一個字符串而不是一個真實的物體嗎? –

+0

如果只有服務端使用LoginViewModel,我會試着加倍嘗試,不管是否使用JSON。stringify()在客戶端,它工作正常,我從來沒有意識到它可以這樣,現在學習。 –