微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 c# 中路由 API 调用 return NotFound

如何解决在 c# 中路由 API 调用 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,但它总是返回 StatusCode Not Found。我如何使这条路线工作?

解决方法

您的方法仅支持 HttpPost,因此您应该使用 this 并且由于它是一个post请求,数据应该像姓名、密码和电子邮件一样应该放在一个正文中

使用用户名、密码和电子邮件创建一个对象,对其进行序列化,设置标题并将其包含在方法中

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。