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

问题描述 投票:0回答:2

我需要通过数据库中的 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/}


编辑客户方法

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;
}
c# json asp.net-core .net-core asp.net-core-webapi
2个回答
3
投票

您需要通过删除 {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)

0
投票

我不是 Web API 方面的专家,但我怀疑这可能是由于 API 期望

customer
出现在请求 URL 中。

尝试将 API 路由更改为

[Route("api/[controller]")]

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

© www.soinside.com 2019 - 2024. All rights reserved.