如何从Android上的RestSharp发送POST请求到WebAPI服务器

时间:2017-10-27 18:37:56

标签: android asp.net-web-api xamarin.forms restsharp

我有一个Android应用程序需要调用asp.net核心web api服务器。

我正在使用RestSharp发出请求。

以下是生成请求的代码:

public LoginResponse SignInWithGoogle(string token)
        {
            //Api request for token
            RestRequest request = new RestRequest("login/google", Method.POST);

            request.AddJsonBody(new { Token = token });
            //request.AddParameter("token", token, ParameterType.GetOrPost);

            var response = restClient.Execute<LoginResponse>(request);

            if (response.ErrorException != null)
            {
                throw new Exception("The APi request failed. See inner exception for more details", response.ErrorException);
            }

            AuthenticationToken = response.Data.token;
            restClient.Authenticator = authenticator;

            return response.Data;
        }

以下是网络API代码:

[AllowAnonymous]
[HttpPost]
[Route("google")]
public IActionResult GoogleLogin([FromBody] GoogleLoginDto data)
{
    GoogleJsonWebSignature.Payload payload;
    JwtSecurityTokenHandler tokenHandler = new JwtSecurityTokenHandler();
    SigningCredentials creds = new SigningCredentials(Global.symmetricSecurityKey, SecurityAlgorithms.HmacSha256);

    //Try to validate the Google token.
    try
    {
        payload = GoogleJsonWebSignature.ValidateAsync(data.Token).Result;                
    }
    catch (Exception e)
    {
        return Unauthorized();
    }
...
}

GoogleLoginDto包含一个公开的属性Token

问题是我得到了404.在我看来,请求中的JSON没有被序列化为GoogleLoginDto,但我无法找到原因......我是...猜测,因为API无法找到data字段,因此我认为我要求的路线不存在...

我也尝试过request.AddParameter("token", token, ParameterType.GetOrPost);,但我得到一个例外,即Content-Type无效。

我考虑添加Content-Type标题,但这似乎很荒谬,因为RestSharp应该自动确定...

任何人都能看到我在这里失踪的东西吗?感谢。

1 个答案:

答案 0 :(得分:0)

API无法将提供的URL映射到控制器操作。这就是404 Not Found。与数据无关。这是URL。

鉴于所需的URL为login/google,请确保目标控制器已定义适当的路由,以允许将请求映射到正确的操作。

[Route("login")] // Route prefix
public class LoginController : Controller {    
    [AllowAnonymous]
    [HttpPost("google")] // Matches POST login/google
    public async Task<IActionResult> GoogleLogin([FromBody] GoogleLoginDto data) {
        if(ModelState.IsValid) {
            GoogleJsonWebSignature.Payload payload;
            var tokenHandler = new JwtSecurityTokenHandler();
            var creds = new SigningCredentials(Global.symmetricSecurityKey, SecurityAlgorithms.HmacSha256);        
            //Try to validate the Google token.
            try {
                payload = await GoogleJsonWebSignature.ValidateAsync(data.Token);
            } catch (Exception e) {
                return Unauthorized();
            }
            return Ok();
        }
        return BadRequest();
    }    
}