使用 POST 方法时的 HTTP 错误

Posted

技术标签:

【中文标题】使用 POST 方法时的 HTTP 错误【英文标题】:HTTP Errors When Using POST Methods 【发布时间】:2022-01-21 07:15:49 【问题描述】:

我似乎不太明白如何从使用 ASP.NET 托管的 Blazor WASM 项目调用 HTTP POST 函数。我很难找到任何使用 .NET 6 之后的 POST 方法的示例,因为它太新了。我尝试将 content-headers 设置为 JSON 以及从实际控制器函数中检索请求正文的许多不同方法,但我只得到 500、415 和 400 错误。我也尝试过不使用模型绑定控制器功能,但无济于事。不过,我不认为这是问题所在,因为据我所知,使用 [ApiController] 属性可以推断出正确的模型绑定。我只能想象问题源于 HTTP 调用。

调用方法的服务:

public async Task CreateUser(User user)

    await _httpClient.PostAsJsonAsync("users", user);

控制器功能:

[HttpPost]
public async Task PostUser(User user)

    _context.Users.Add(user);
    await _context.SaveChangesAsync();

上面的代码给出的只是一个简单的400错误。

另外,我已经手动将一个测试用户添加到数据库中,并且我能够毫无问题地检索它。

【问题讨论】:

您是否将您正在使用的 HttpClient 的基本 URL 设置为您的 api 的基本 URL? 【参考方案1】:

这是我的一个演示项目中的一些代码,显示了获取 WeatherForecast 记录的 API 调用。

这是 Web Assembly 项目 DataBroker:

public class WeatherForecastAPIDataBroker : IWeatherForecastDataBroker

    private readonly HttpClient? httpClient;

    public WeatherForecastAPIDataBroker(HttpClient httpClient)
        => this.httpClient = httpClient!;

    public async ValueTask<bool> AddForecastAsync(WeatherForecast record)
    
        var response = await this.httpClient!.PostAsJsonAsync<WeatherForecast>($"/api/weatherforecast/add", record);
        var result = await response.Content.ReadFromJsonAsync<bool>();
        return result;
    

    public async ValueTask<bool> DeleteForecastAsync(Guid Id)
    
        var response = await this.httpClient!.PostAsJsonAsync<Guid>($"/api/weatherforecast/delete", Id);
        var result = await response.Content.ReadFromJsonAsync<bool>();
        return result;
    

    public async ValueTask<List<WeatherForecast>> GetWeatherForecastsAsync()
    
        var list = await this.httpClient!.GetFromJsonAsync<List<WeatherForecast>>($"/api/weatherforecast/list");
        return list!;
    

这是它调用的控制器:

namespace Blazr.Demo.Controllers;

[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase

    private IWeatherForecastDataBroker weatherForecastDataBroker;

    public WeatherForecastController(IWeatherForecastDataBroker weatherForecastDataBroker)
        => this.weatherForecastDataBroker = weatherForecastDataBroker;

    [Route("/api/weatherforecast/list")]
    [HttpGet]
    public async Task<List<WeatherForecast>> GetForecastAsync()
        => await weatherForecastDataBroker.GetWeatherForecastsAsync();

    [Route("/api/weatherforecast/add")]
    [HttpPost]
    public async Task<bool> AddRecordAsync([FromBody] WeatherForecast record)
        => await weatherForecastDataBroker.AddForecastAsync(record);

    [Route("/api/weatherforecast/delete")]
    [HttpPost]
    public async Task<bool> DeleteRecordAsync([FromBody] Guid Id)
        => await weatherForecastDataBroker.DeleteForecastAsync(Id);

演示项目的回购Blazor.Demo

Controller Code Data Broker Code

【讨论】:

以上是关于使用 POST 方法时的 HTTP 错误的主要内容,如果未能解决你的问题,请参考以下文章

AngularJS $http.POST 方法 405 错误

Web API POST 方法返回 HTTP/1.1 500 内部服务器错误

在 Spring boot 中使用 post 方法保存多个实体时的无限循环

POST 方法在 npm http-server 上抛出错误 405

perl中设置POST登录时的重定向

Python: 模拟post请求时的相关问题:cookie,json