【问题标题】:POSTMAN POST Request Returns Unsupported Media TypePOSTMAN POST 请求返回不支持的媒体类型
【发布时间】:2018-10-13 20:15:21
【问题描述】:

我正在遵循 Adam Freeman 的“Pro ASP.NET Core MVC 2”中的 API 说明。我有以下 API 控制器类:

    [Route("api/[controller]")]
    public class ReservationController : Controller
    {
        private IRepository repository;

    public ReservationController(IRepository repo) => repository = repo;

    [HttpGet]
    public IEnumerable<Reservation> Get() => repository.Reservations;

    [HttpGet("{id}")]
    public Reservation Get(int id) => repository[id];

    [HttpPost]
    public Reservation Post([FromBody] Reservation res) =>
        repository.AddReservation(new Reservation
        {
            ClientName = res.ClientName,
            Location = res.Location
        });

    [HttpPut]
    public Reservation Put([FromBody] Reservation res) => repository.UpdateReservation(res);

    [HttpPatch("{id}")]
    public StatusCodeResult Patch(int id, [FromBody]JsonPatchDocument<Reservation> patch)
    {
        Reservation res = Get(id);
        if(res != null)
        {
            patch.ApplyTo(res);
            return Ok();
        }
        return NotFound();
    }

    [HttpDelete("{id}")]
    public void Delete(int id) => repository.DeleteReservation(id);
}

文本使用 PowerShell 来测试 API,但我想使用 Postman。在 Postman 中,GET 调用有效。但是,我无法让 POST 方法返回值。错误显示为“状态代码:415;不支持的媒体类型'

在 Postman 中,Body 使用表单数据,其中:

key: ClientName, value: Anne
key: Location, value: Meeting Room 4

如果我将类型下拉菜单选择为“JSON”,它会显示“意外的 'S'”

在标题中,我有:

`key: Content-Type, value: application/json`

我也在正文中尝试了以下原始数据,而不是表单数据:

{clientName="Anne"; location="Meeting Room 4"}

当我使用 PowerShell 时,API 控制器确实工作并返回正确的值。对于 POST 方法,以下工作:

Invoke-RestMethod http://localhost:7000/api/reservation -Method POST -Body (@{clientName="Anne"; location="Meeting Room 4"} | ConvertTo-Json) -ContentType "application/json"

【问题讨论】:

    标签: c# api asp.net-core postman


    【解决方案1】:

    如果使用 Patch 方法,如果 postman 的原始 Body 部分像这样会更好

        {
            "op": "replace", "path": "/firstName" , "value": "FirstName",
        }
    

    数据输入为 application/json

    【讨论】:

    • 您不应该修补数组,帖子 应该 是一个包装的对象,但您的示例是数组内的一个对象,此解决方案不是对以前接受的答案并且具有误导性,如果它适用于您,那么您的 API 实现存在一些非标准。
    【解决方案2】:

    当使用带有 POST 和 JSON 正文的 Postman 时,您必须使用 raw 数据条目并将其设置为 application/json,数据将如下所示:

    {"clientName":"Anne", "location":"Meeting Room 4"}
    

    注意键和值是如何引用的。

    【讨论】:

    • 也许我做错了什么,但我仍然有同样的错误。在 Postmans Body 中,我使用了原始和您所显示的引文。在“标题”中,我使用 Content-Type 键和 JSON(application/json) 作为值。
    • @KirkLarkin 感谢您注意到这一点,没有注意到 =。相应地修正了答案。
    • @KirkLarkin,很抱歉您在我发帖之前编辑了您的评论。我已经尝试了你的建议,但仍然得到同样的错误
    • @coolhand 您不必手动添加标头值、删除它或将值设置为application/json JSON(application/json) 是 Postman 中的框输入原始数据
    • 也许这个 cmets 可以包含在下一个发现这个问题的人的答案中
    猜你喜欢
    • 2016-11-21
    • 1970-01-01
    • 2015-06-17
    • 2019-07-06
    • 2016-11-26
    • 2012-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多