簡體   English   中英

嘗試在本地C#web api中使用Postman PUT字符串,始終為null或失敗

[英]Trying to PUT string with Postman in local C# web api, always null or fails

我目前在本地運行此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。 我選擇了body選項卡,並將字符串粘貼到raw body選項卡中:

在此輸入圖像描述

它聲明我的文本不受支持,或者當我添加斷點時,值為null或我得到描述格式的錯誤不正確。

我究竟做錯了什么?

將媒體類型更改為x-www-form-urlencoded而不是multipart / form-data。

此外,WebAPI特別關注FromBody參數。 http://encosia.com/using-jquery-to-post-frombody-parameters-to-web-api/

對你而言,我認為這是相關部分:

  1. [FromBody]參數必須編碼為= value

剩下的最后一個障礙是Web API要求您以特定格式傳遞[FromBody]參數。 即使我們使用[FromBody]修飾方法的參數之后,這就是我們的值參數在前一個示例中為null的原因。

Web API的模型綁定器不需要大多數客戶端和服務器端框架所期望的相當標准的key = value編碼,而是希望在POST主體中找到[FromBody]值而根本沒有關鍵名稱。 換句話說,它代替key = value,它正在尋找= value。

到目前為止,這部分是將原始類型發送到Web API POST方法中最令人困惑的部分。 一旦你了解它就不會太糟糕,但非常不直觀且不可發現。

那是因為沒有媒體類型格式化程序可以將原始字符串序列化到您的模型中(使用[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);
}

作為替代方案,您可以自己實現自定義媒體類型格式化程序,根據此答案

嘗試添加text/plain的內容類型

在此輸入圖像描述

還有一個類似的Q&A 在這里

我發現解決方案#1對我有用,因為我試圖PUT包含Key / Value對的JSON。 所以最初我的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請求

只是為了添加我的位,還有一種解決方案可以將原語傳遞給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.");
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM