如何从 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?
我需要通过 API 在我的数据库中调用来保存我在模型中所做的更改。当我在 Web 上单独 运行 时,我已经检查过我的 API 工作正常。但它给我一个错误 StatusCode: 405, ReasonPhrase: 'Method Not Allowed'
。我正在尝试发送和反对,并试图查看所提出的请求是否已完成。当我尝试调试它时,它没有在我的 API 控制器上发送命中。
这是我的模型class:
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;
}
我不是网络专家 API,但我怀疑这可能是因为 API 期望 customer
被请求 URL。
尝试将 API 路由更改为 [Route("api/[controller]")]
这可能是一条评论,但我没有足够的声誉:)
您需要通过删除 {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);
而不是放置。
并将 [FromBody] 添加到操作中
[HttpPost("~/api/EditCustomer")]
public IActionResult EditCustomer([FromBody] Customer customer)
我需要通过 API 在我的数据库中调用来保存我在模型中所做的更改。当我在 Web 上单独 运行 时,我已经检查过我的 API 工作正常。但它给我一个错误 StatusCode: 405, ReasonPhrase: 'Method Not Allowed'
。我正在尝试发送和反对,并试图查看所提出的请求是否已完成。当我尝试调试它时,它没有在我的 API 控制器上发送命中。
这是我的模型class:
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;
}
我不是网络专家 API,但我怀疑这可能是因为 API 期望 customer
被请求 URL。
尝试将 API 路由更改为 [Route("api/[controller]")]
这可能是一条评论,但我没有足够的声誉:)
您需要通过删除 {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);
而不是放置。
并将 [FromBody] 添加到操作中
[HttpPost("~/api/EditCustomer")]
public IActionResult EditCustomer([FromBody] Customer customer)