web-dev-qa-db-ja.com

ASP.NET Web APIはapplication / x-www-form-urlencoded HTTP POSTを取得できません

私はweb-apiが初めてです。 HTTP POST web-apiを使用してデータを受信します。コンテンツタイプはapplication/x-www-form-urlencodedで、リクエストの本文は次のようになります。

data={"mac":"0004ED123456","model":"SG6200NXL"}(JSON形式)。

私のコントローラーは次のようなものです。

public void Post([FromBody]string formData)
{
    data.Add(formData);
}

ただし、formDataは常にnullです。リクエストの本文を次のように変更した場合のみ:

={"mac":"0004ED123456","model":"SG6200NXL"}

{"mac":"0004ED123456","model":"SG6200NXL"}formData文字列に保存されていることがわかります。

だから私の質問は、どのようにフォーマットでデータを受け取るべきですか?

data={"mac":"0004ED123456","model":"SG6200NXL"}

JSONをC#に脱塩する簡単な方法はありますか?

手伝ってくれてありがとう!

更新:モデルを使用しようとしましたが、まだ機能しません。私のモデルは:

public class Device
    {
        public string mac { get; set; }
        public string model { get; set; }
    }

そして私のHTTP POSTリクエストは:

ヘッダ:

User-Agent: Fiddler
Content-type: application/x-www-form-urlencoded
Host: localhost:52154
Content-Length: 46

体:

data={"mac":"0004ED123456","model":"SG6200NX"}

HTTP POSTはルーターによって送信されます。私の仕事はデータを受信することです。]がわかっている限り、Content-type: application/x-www-form-urlencodedを使用する必要があります。

25
Jun

ここ からの引用:

デフォルトでは、Web APIはリクエストURIから単純型を取得しようとします。 FromBody属性は、リクエスト本文から値を読み取るようにWeb APIに指示します。

Web APIは応答本文を最大1回しか読み取らないため、アクションの1つのパラメーターのみが要求本文から取得できます。リクエスト本文から複数の値を取得する必要がある場合は、複合型を定義します。

次に、クライアントは次の形式で値を送信する必要があります。

= value

特に、単純型の場合、名前/値のペアの名前部分は空でなければなりません。

したがって、data=string形式でデータを投稿する場合は、複合型を作成する必要があります。

public class MyFormData
{
    public string Data { get; set; }
}

そして、コントローラーを次のように更新します。

public void Post(MyFormData formData)
{
    //your JSON string will be in formData.Data
}

もちろん、コンテンツタイプをJSONに変更することもできますが、実際には要件によって異なります。

30
YK1

この投稿は古いものですが、答えを探しているときにつまずきました。私が私の仕事を始めた方法を投稿します。誰かが役に立つと思うかもしれません。

リクエストは次のとおりです。

POST /api/values HTTP/1.1
Host: localhost:62798
Accept: text/json
Content-Type: application/x-www-form-urlencoded
Cache-Control: no-cache
Postman-Token: 51ee1c5f-acbb-335b-35d9-d2b8e62abc74

UID=200&EMAIL=john%40jones.com&FIRST_NAME=John&LAST_NAME=jones&PHONE=433-394-3324&CITY=Seattle&STATE_CODE=WA&Zip=98105

モデルは次のとおりです。

public class SampleModel{
    public string UID { get; set; }

    public string Email { get; set; }

    public string First_Name { get; set; }

    public string Last_Name { get; set; }

    public string Phone { get; set; }

    public string City { get; set; }

    public string State_Code { get; set; }

    public string Zip { get; set; }
}

そしてここに、POSTメソッドがあります。これは自動で(FromBody)がurlencoded値をモデルに変換します。

public HttpResponseMessage Post([FromBody] SampleModel value){

私はどんな価値も選ぶことができました。

    SearchCity(value.City);
    SearchName(value.Last_Name);
6
Unu

次のようなデータのオブジェクトを作成する必要があります。

public class Device
{
  public string mac {get;set;}
  public string model {get;set;}
}

次に、コントローラーのアクションメソッドを次のように変更し、オブジェクトを消費からこのメソッドに渡します

public void Post(Device deviceData)
{
    // You can extract data like deviceData.mac, deviceData.model etc
    data.Add(deviceData);
}

人気のあるライブラリの1つを使用できます json.net C#のjsonオブジェクトのシリアル化/非シリアル化に

3
SoftSan

モデルを作成する

public class MyClass {
    public string mac { get; set; }
    public string model { get; set; }
}

.net JavaScriptSerializer()。Deserializeを使用します

public void Post([FromBody]string formData){
    MyClass obj = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<MyClass>(formData);
    //get mac and model by obj.mac obj.model
}

乾杯:)

2
HenryChuang

Content-type:application/x-www-form-urlencodedを使用している場合、JSONの受信は期待できません。

フォームを使用してデータをWeb Apiコントローラーに送信していると思いますか?

最初にContent-typeapplication/jsonに変更する必要があります。リクエスト本文でJSONデータを送信していることを確認する必要があります。フォームを介してデータを送信する場合、javascriptを使用してフォームデータからJSONオブジェクトを作成できます。

C#でJSONをデシリアライズするには、Json.NETをお勧めします: http://json.codeplex.com/

0