我有一个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应该自动确定...
任何人都能看到我在这里失踪的东西吗?感谢。
答案 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();
}
}