【问题标题】:How to make a PUT request from ASP.NET core mvc to Web API in asp.net core?如何从 ASP.NET 核心 mvc 向 asp.net 核心中的 Web API 发出 PUT 请求?
【发布时间】:2021-12-08 04:19:00
【问题描述】:

我需要通过 API 调用在我的数据库中保存我在模型中所做的更改。当我在 Web 上单独运行它时,我检查了我的 API 工作正常。但它给了我一个错误StatusCode: 405, ReasonPhrase: 'Method Not Allowed'。我正在尝试发送和反对并尝试查看请求是否已完成。当我尝试调试它时,它没有在我的 API 控制器上发送命中。

这是我的模型类:

 public class Customer
    {
        [Required]
        public Guid CustomerId { get; set; }
        public int Age { get; set; }
        public int Phone { get; set; }
    }

API 中的 PUT 方法:

[HttpPut]
        [Route("api/[controller]/{customer}")]
        public IActionResult EditCustomer(Customer customer)
        {
            var cust = _customerData.EditCustomer(customer);
            if (cust == string.Empty)
            {
                return Ok();
            }
            else
            {
                return new StatusCodeResult(StatusCodes.Status500InternalServerError);
            }
        }

我在项目中调用API的方法:

 using (HttpClient client = new HttpClient())
            {
                client.BaseAddress = new Uri(apiBaseUrl);
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(
                new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json")
                );
                var sum = await client.PutAsJsonAsync("api/Customer/", customer);
                if (sum.StatusCode == System.Net.HttpStatusCode.OK)
                {
                    
                    return RedirectToActionPermanent(actionName: "SingIn");
                }
                else
                {
                    TempData["msg"] = "There is an error";
                    return View();
                }

其中基地址= {https://localhost:44398/}


EditCustomer 方法

public string EditCustomer(Customer customer)
        {
            try
            {
                var pro = _customerContext.Customer.Where(e => e.CustomerId == customer.CustomerId).FirstOrDefault();
                pro.Age = customer.Age;
                pro.Phone = customer.Phone;
                pro.Name = customer.Name;
                _customerContext.Entry(pro).State = EntityState.Modified;
                _customerContext.SaveChanges();
            }
            catch(Exception e)
            {
                return e.Message;
            }
            return string.Empty;
        }

【问题讨论】:

  • 嗨@Psychonaut007,我建议你可以分享你的EditCustomer对应的控制器。另外请检查您的customer 是否具有正确的值。
  • 你好@Rena 我已经分享了上述方法,但问题是我一开始没有在控制器中收到点击。

标签: c# json asp.net-core .net-core asp.net-core-webapi


【解决方案1】:

您需要通过删除 {Customer} 来修复您的操作路线,因为您在请求正文中发送客户,而不是作为路线值

 [Route("~/api/Customer")]

请求

  var sum = await client.PutAsJsonAsync("/api/Customer", customer);

或更好地将动作路由名称修复为有意义的

  [Route("~/api/EditCustomer")]

var sum = await client.PutAsJsonAsync("/api/EditCustomer", customer);

AsJsonAsync 有时会导致问题

试试这个代码

var json = JsonSerializer.Serialize(customer);
//or if you are using Newtonsoft
var json = JsonConvert.SerializeObject(customer);

var contentData = new StringContent(json, Encoding.UTF8, "application/json");
var response = await client.PutAsync("/api/Customer", contentData);
              
if (response.IsSuccessStatusCode)
    return RedirectToActionPermanent("SingIn");
else
{
 TempData["msg"] = "There is an error";
 return View();
}

但恕我直言,我更喜欢使用

client.PostAsync("/api/EditCustomer", contentData); 

而不是 Put。

并将 [FromBody] 添加到操作中

 [HttpPost("~/api/EditCustomer")]
 public IActionResult EditCustomer([FromBody] Customer customer)

【讨论】:

  • 感谢您的回复@Serge!我已应用上述更改并收到此错误StatusCode: 400, ReasonPhrase: 'Bad Request
  • 我认为是你的操作问题。在 API 操作中使用调试器并检查客户是否为空
【解决方案2】:

我不是网络 API 专家,但我怀疑这可能是因为 API 期望 customer 出现在请求 URL 中。

尝试将 API 路由更改为 [Route("api/[controller]")]

这可能是一条评论,但我没有足够的声誉:)

【讨论】:

  • 谢谢,这是可行的,但我正在寻找一种解决方案,我可以传递整个对象,以使其在处理大量变量时更可行。
猜你喜欢
  • 1970-01-01
  • 2020-01-24
  • 2019-02-04
  • 2019-08-31
  • 2016-12-14
  • 1970-01-01
  • 2023-01-22
  • 1970-01-01
  • 2017-01-30
相关资源
最近更新 更多