如何从 ASP.NET 核心 mvc 向 asp.net 核心中的 Web API 发出 PUT 请求?

Posted

技术标签:

【中文标题】如何从 ASP.NET 核心 mvc 向 asp.net 核心中的 Web API 发出 PUT 请求?【英文标题】:How to make a PUT request from ASP.NET core mvc to Web API in asp.net core? 【发布时间】: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 我已经分享了上述方法,但问题是我一开始没有在控制器中收到点击。 【参考方案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]")]

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

【讨论】:

谢谢,这是可行的,但我正在寻找一种解决方案,我可以传递整个对象,以使其在处理大量变量时更可行。

以上是关于如何从 ASP.NET 核心 mvc 向 asp.net 核心中的 Web API 发出 PUT 请求?的主要内容,如果未能解决你的问题,请参考以下文章

asp.net 核心 1.0 mvc。从 Request.Body 获取原始内容

ASP.NET MVC 核心外键

如何在 asp.net mvc 核心中链接 css?

如何在asp.net核心中从客户端调用web api方法?

如何在 ASP.NET Core MVC 中使用 ADO.NET 向存储过程添加参数?

ASP.NET 核心的 Mvc.LocalizationSample.Web 问题