尝试在本地 C# Web api 中使用 Postman 放置字符串,始终为空或失败

Posted

技术标签:

【中文标题】尝试在本地 C# Web api 中使用 Postman 放置字符串,始终为空或失败【英文标题】:Trying to PUT string with Postman in local C# web api, always null or fails 【发布时间】:2016-08-04 16:42:32 【问题描述】:

我目前在本地运行这个 WEB API:

// POST api/CsvParse
[HttpPut]
public void Put([FromBody]string value)

    if (string.IsNullOrEmpty(value))
        throw new Exception("Input is null or empty.");

我目前让它在本地运行,并且正在使用 POSTMAN 向 put 发送一个字符串。我选择了正文选项卡,并将字符串粘贴到原始正文选项卡中:

它指出我的文本不受支持,或者当我添加断点时值为 null,或者我收到描述格式不正确的错误。

我做错了什么?

【问题讨论】:

【参考方案1】:

补充一点,还有一种解决方案可以将原语传递给 POST 或 PUT 方法。只需将模型指定为JObject。然后 ASP.Net 核心 web api 将传入的 JSON 对象(包含字符串等原语)绑定到 JObject 模型对象中。

您的代码如下所示:

// POST api/CsvParse
[HttpPut]
public void Put([FromBody]JObject value)

    //access your string data
    string data = value[SPECIFY_KEY_HERE];

    if (string.IsNullOrEmpty(data))
        throw new Exception("Input is null or empty.");

【讨论】:

【参考方案2】:

有类似问答here

当我尝试 PUT 包含键/值对的 JSON 时,我发现解决方案 #1 对我有用。所以最初我的 JSON 是这样的


    "subscriber": 
    "Id": "2",
    "subscriptions":[
        
            "Name": "Subscription 1",
            "Id": "18",
            "IsSubscribed": false
        ,
        
            "Name": "Subscription 2",
            "Id": "19",
            "IsSubscribed": false
        ,
        
            "Name": "Subscription 3",
            "Id": "20",
            "IsSubscribed": false
        
    ]
    

但是我修改成了


    "Id": "2",
    "subscriptions":[
        
            "Name": "Subscription 1",
            "Id": "18",
            "IsSubscribed": false
        ,
        
            "Name": "Subscription 2",
            "Id": "19",
            "IsSubscribed": false
        ,
        
            "Name": "Subscription 3",
            "Id": "20",
            "IsSubscribed": false
        
    ]

这很奏效。使用 [FromBody] 在我的 C# web api 中识别出来自 Postman 的 PUT 请求

【讨论】:

【参考方案3】:

这是因为没有媒体类型格式化程序可以将原始字符串序列化到您的模型中(您的路由参数带有[FromBody] 属性)。

一种快速而肮脏的解决方法是直接将请求的正文作为字符串读取:

[HttpPut]
public async Task<HttpResponseMessage> Put(HttpRequestMessage request)

    var myCsv = await request.Content.ReadAsStringAsync();

    // do stuff with your string

    return new HttpResponseMessage(HttpStatusCode.OK);

作为替代方案,您可以按照this answer 自己实现自定义媒体类型格式化程序。

【讨论】:

【参考方案4】:

尝试添加text/plain的内容类型

【讨论】:

【参考方案5】:

将媒体类型更改为 x-www-form-urlencoded 而不是 multipart/form-data。

此外,WebAPI 对 FromBody 参数有特殊要求。 http://encosia.com/using-jquery-to-post-frombody-parameters-to-web-api/

对你来说,我认为这是相关的部分:

    [FromBody] 参数必须编码为 =value

剩下的最后一个障碍是 Web API 要求你通过 [FromBody] 特定格式的参数。这就是为什么 在前面的示例中,我们的 value 参数为 null,即使在我们之后 用 [FromBody] 修饰方法的参数。

而不是大多数客户使用的相当标准的 key=value 编码- 和服务器端框架期望,Web API 的模型绑定器期望 在没有键名的 POST 正文中找到 [FromBody] 值。 换句话说,它不是在寻找 key=value,而是在寻找 =value。

到目前为止,这部分是发送原语中最令人困惑的部分 键入 Web API POST 方法。看懂了就不好说了 但非常不直观且不易被发现。

【讨论】:

以上是关于尝试在本地 C# Web api 中使用 Postman 放置字符串,始终为空或失败的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中调用 web api

在 web-api POST (C#) 上输入 JSON

尝试使用web api发布txt文件,获得415不支持的媒体类型

C# Web API:迭代数组并追加到 HTML 表

使用 C# Web Api 和 axios 进行令牌认证

C# Web Api 2 PUT 和 POST 请求“不支持”