在 c# return NotFound 中路由 API 调用
Routing an API call in c# return NotFound
所以我有这个应用程序连接到 API 以在数据库中注册用户。该方法如下所示:
HttpClient client = new HttpClient();
var uri = new Uri(string.Format("https://myapinameonazure.azurewebsites.net/api/register?fullName=" + username.Text + "&password=" + password.Text + "&email=" + email.Text));
HttpResponseMessage response;
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
response = await client.GetAsync(uri);
if(response.StatusCode == System.Net.HttpStatusCode.Accepted)
{
Toast.MakeText(this, "Rejestracja pomyślna.", ToastLength.Short).Show();
}
else
{
Toast.MakeText(this, "Istnieje już konto z podanym mailem.", ToastLength.Short).Show();
}
(凭证在方法之前声明)
我的 API 中的 POST 方法如下所示:
// POST api/register
[ActionName("Xamarin_reg")]
[HttpPost]
[Route("api/register")]
[Route("api/register?")]
[Route("api/register?fullName={fullName:string}&password={password:string}&email={email:string}")]
HttpResponseMessage Xamarin_reg(string fullName, string password, string email)
{
MySqlConnection conn = new MySqlConnection(Constants.connectionString);
MySqlDataReader reader;
MySqlCommand checkEmailCommand = new MySqlCommand(Constants.checkIfAlreadyRegisteredQuery, conn);
checkEmailCommand.Parameters.Add("@email", MySqlDbType.VarChar).Value = email;
conn.Open();
reader = checkEmailCommand.ExecuteReader();
reader.Read();
if (reader.HasRows)
{
return new HttpResponseMessage(HttpStatusCode.Unauthorized);
}
else
{
reader.Close();
}
MySqlCommand cmd = new MySqlCommand();
cmd.Connection = conn;
cmd.CommandText = Constants.InsertNewUserQuery;
cmd.Parameters.Add("@username", MySqlDbType.VarChar).Value = fullName;
cmd.Parameters.Add("@password", MySqlDbType.VarChar).Value = password;
cmd.Parameters.Add("@password_salt", MySqlDbType.VarChar).Value = password;
cmd.Parameters.Add("@email", MySqlDbType.VarChar).Value = email;
cmd.Parameters.Add("@timestamp", MySqlDbType.DateTime).Value = dtNow;
cmd.ExecuteNonQueryAsync();
conn.Close();
return new HttpResponseMessage(HttpStatusCode.Accepted);
}
如您所见,我尝试制作一个路由模板来匹配此 url,但它总是 return 未找到 StatusCode。我如何使这条路线有效?
您的方法只支持 HttpPost,所以您应该使用 this
因为这是一个 post 请求,姓名、密码和电子邮件等数据应该在 body
中
用用户名、密码和电子邮件创建一个object,序列化它,设置headers并将它包含在方法
中
var data = new { fullName = username.Text, password = password.Text, email = email.Text };
var content = JsonConvert.SerializeObject(data);
var buffer = System.Text.Encoding.UTF8.GetBytes(content);
var byteContent = new ByteArrayContent(buffer);
byteContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
var result = client.PostAsync(uri, byteContent).Result
所以我有这个应用程序连接到 API 以在数据库中注册用户。该方法如下所示:
HttpClient client = new HttpClient();
var uri = new Uri(string.Format("https://myapinameonazure.azurewebsites.net/api/register?fullName=" + username.Text + "&password=" + password.Text + "&email=" + email.Text));
HttpResponseMessage response;
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
response = await client.GetAsync(uri);
if(response.StatusCode == System.Net.HttpStatusCode.Accepted)
{
Toast.MakeText(this, "Rejestracja pomyślna.", ToastLength.Short).Show();
}
else
{
Toast.MakeText(this, "Istnieje już konto z podanym mailem.", ToastLength.Short).Show();
}
(凭证在方法之前声明)
我的 API 中的 POST 方法如下所示:
// POST api/register
[ActionName("Xamarin_reg")]
[HttpPost]
[Route("api/register")]
[Route("api/register?")]
[Route("api/register?fullName={fullName:string}&password={password:string}&email={email:string}")]
HttpResponseMessage Xamarin_reg(string fullName, string password, string email)
{
MySqlConnection conn = new MySqlConnection(Constants.connectionString);
MySqlDataReader reader;
MySqlCommand checkEmailCommand = new MySqlCommand(Constants.checkIfAlreadyRegisteredQuery, conn);
checkEmailCommand.Parameters.Add("@email", MySqlDbType.VarChar).Value = email;
conn.Open();
reader = checkEmailCommand.ExecuteReader();
reader.Read();
if (reader.HasRows)
{
return new HttpResponseMessage(HttpStatusCode.Unauthorized);
}
else
{
reader.Close();
}
MySqlCommand cmd = new MySqlCommand();
cmd.Connection = conn;
cmd.CommandText = Constants.InsertNewUserQuery;
cmd.Parameters.Add("@username", MySqlDbType.VarChar).Value = fullName;
cmd.Parameters.Add("@password", MySqlDbType.VarChar).Value = password;
cmd.Parameters.Add("@password_salt", MySqlDbType.VarChar).Value = password;
cmd.Parameters.Add("@email", MySqlDbType.VarChar).Value = email;
cmd.Parameters.Add("@timestamp", MySqlDbType.DateTime).Value = dtNow;
cmd.ExecuteNonQueryAsync();
conn.Close();
return new HttpResponseMessage(HttpStatusCode.Accepted);
}
如您所见,我尝试制作一个路由模板来匹配此 url,但它总是 return 未找到 StatusCode。我如何使这条路线有效?
您的方法只支持 HttpPost,所以您应该使用 this 因为这是一个 post 请求,姓名、密码和电子邮件等数据应该在 body
中用用户名、密码和电子邮件创建一个object,序列化它,设置headers并将它包含在方法
中var data = new { fullName = username.Text, password = password.Text, email = email.Text };
var content = JsonConvert.SerializeObject(data);
var buffer = System.Text.Encoding.UTF8.GetBytes(content);
var byteContent = new ByteArrayContent(buffer);
byteContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
var result = client.PostAsync(uri, byteContent).Result