it-swarm.com.de

ASP.NET-Web-API kann nicht application/x-www-form-urlencoded HTTP abrufen POST

Ich bin neu im Web-API. Ich möchte HTTP POST - Daten über Web-API erhalten. Der Inhaltstyp ist application/x-www-form-urlencoded und der Anforderungstext ist wie folgt:

data={"mac":"0004ED123456","model":"SG6200NXL"} (JSON-Format). 

Mein Controller ist so:

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

FormData ist jedoch immer null. Nur wenn ich den Anfragetext ändere in:

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

Ich kann feststellen, dass {"mac":"0004ED123456","model":"SG6200NXL"} in meiner formData-Zeichenfolge gespeichert wurde.

Meine Frage ist also, wie soll ich die Daten im Format erhalten: 

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

Und gibt es eine einfache Möglichkeit, die JSON in C # zu entsalzen?

Danke für die Hilfe!

UPDATE: Ich habe versucht, das Modell zu verwenden, aber es funktioniert immer noch nicht für mich . Mein Modell ist:

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

und meine HTTP POST -Anforderung lautet:

header:

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

karosserie:

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

Ich muss Content-type: application/x-www-form-urlencoded verwenden, soweit ich weiß, da das HTTP POST von einem Router gesendet wird. Meine Aufgabe ist es, die Daten zu erhalten.

22
Jun

Zitieren von hier :

Standardmäßig versucht die Web-API, einfache Typen vom Anforderungs-URI abzurufen. Das Attribut FromBody weist die Web-API an, den Wert aus dem Anforderungshauptteil zu lesen.

Das Web-API liest den Antworttext höchstens einmal, sodass nur ein Parameter einer Aktion aus dem Anforderungstext stammen kann. Wenn Sie mehrere Werte aus dem Anforderungstext abrufen möchten, definieren Sie einen komplexen Typ.

Zweitens muss der Client den Wert im folgenden Format senden:

= Wert

Insbesondere muss der Namensteil des Name/Wert-Paares für einen einfachen Typ leer sein.

Wenn Sie also Daten im Format data=string buchen möchten, müssen Sie einen komplexen Typ erstellen.

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

Und aktualisieren Sie Ihren Controller wie folgt:

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

Natürlich besteht für Sie auch die Alternative, den Inhaltstyp in JSON zu ändern. Dies hängt jedoch wirklich von Ihren Anforderungen ab.

28
YK1

Dieser Beitrag ist alt, aber ich bin bei der Suche nach Antworten darauf gestolpert. Ich poste, wie ich meine zur Arbeit gebracht habe, vielleicht wird es jemand nützlich finden. 

Hier ist die Bitte: 

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

Hier ist das Modell: 

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; }
}

Und hier ist die Methode POST, die automatisch (FromBody) umcodierte Werte in das Modell konvertiert. 

public HttpResponseMessage Post([FromBody] SampleModel value){

Ich konnte jeden Wert herausfinden, d.h. 

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

Sie sollten ein Objekt Ihrer Daten erstellen wie:

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

Ändern Sie dann die Aktionsmethode Ihres Controllers wie folgt, und übergeben Sie Ihr Objekt von verbrauchen an diese Methode

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

Sie können eine der beliebten Bibliotheken json.net für die Serialisierung/Deserialisierung des Json-Objekts in C # verwenden.

3
SoftSan

ein Modell erstellen

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

und verwenden Sie .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
}

prost :)

2
HenryChuang

Wenn Sie Content-Typ: application/x-www-form-urlencoded verwenden, können Sie nicht erwarten, dass Sie JSON erhalten.

Ich schätze, Sie verwenden ein Formular, um die Daten an den Web Api-Controller zu senden.

Zuerst müssen Sie den Content-Typ in application/json ändern und dann sicherstellen, dass Sie JSON-Daten in Ihrem Anforderungstext senden. Wenn Sie die Daten über ein Formular senden, können Sie mit Hilfe von Javascript ein JSON-Objekt aus Ihren Formulardaten erstellen.

Um JSON in C # zu deserialisieren, empfehle ich Json.NET: http://json.codeplex.com/

0