2017-08-11 70 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()在客户端,它工作正常,我从来没有意识到它可以这样,现在学习。 –