it-swarm.com.de

Der FromBody-Zeichenfolgenparameter gibt null zurück

Dies ist wahrscheinlich etwas sehr grundlegendes, aber ich habe Schwierigkeiten, herauszufinden, wo ich falsch liege. 

Ich versuche, eine Zeichenfolge aus dem Body eines POST herauszuholen, aber "jsonString" wird nur als Null angezeigt. Ich möchte auch vermeiden, ein Modell zu verwenden, aber vielleicht ist dies nicht möglich. Der Code, den ich mit PostMan treffe, ist folgender:

[Route("Edit/Test")]
[HttpPost]
public void Test(int id, [FromBody] string jsonString)
{
    ...
}

Vielleicht ist es etwas, das ich falsch mit dem Postboten mache, aber ich habe versucht, "= test" (wie in anderen Fragen zu diesem Thema dargestellt) im Wertebereich des Körpers zu verwenden - x-www-form-urlencoded-Abschnitt mit der schlüssel als jsonstring und nichts. Ich habe auch versucht, Rohtext und Rohtext/Plain zu verwenden. Ich bekomme die ID, damit ich weiß, dass die URL korrekt ist. Jede Hilfe wäre sehr dankbar. 

PostMan ist derzeit so eingerichtet:

POST http://localhost:8000/Edit/Test?id=111
key = id  value = 111
Body - x-www-form-urlencoded
key = jsonString  value = "=test"
21
Robert Prine

Durch Deklarieren des Parameters jsonString mit [FromBody] weisen Sie ASP.NET Core an, den Eingabeformatierer zu verwenden, um den bereitgestellten JSON (oder XML) an ein Modell zu binden. Ihr Test sollte also funktionieren, wenn Sie eine einfache Modellklasse angeben

public class MyModel
{
    public string Key {get; set;}
}

[Route("Edit/Test")]
[HttpPost]
public void Test(int id, [FromBody] MyModel model)
{
    ... model.Key....
}

und eine gesendete JSON mag

{
    key: "value"
}

Natürlich können Sie die Modellbindung überspringen und die bereitgestellten Daten direkt abrufen, indem Sie im Controller auf HttpContext.Request zugreifen. Die HttpContext.Request.Body-Eigenschaft gibt Ihnen den Inhaltsstrom oder Sie können über HttpContext.Request.Forms auf die Formulardaten zugreifen.

Ich persönlich bevorzuge die Modellbindung aufgrund der Typsicherheit.

32
Ralf Bönning

Verweisen auf Parameterbindung in ASP.NET-Web-API

Verwendung von [FromBody]

Um zu erzwingen, dass die Web-API einen einfachen Typ aus dem Anfragetext liest, fügen Sie die. [FromBody] Attribut für den Parameter:

[Route("Edit/Test")]
[HttpPost]
public IHttpActionResult Test(int id, [FromBody] string jsonString) { ... }

In diesem Beispiel verwendet das Web-API einen Medientyp-Formatierer, um die .__-Datei zu lesen. Wert von jsonString aus dem Anforderungstext. Hier ist ein Beispielclient anfordern.

POST http://localhost:8000/Edit/Test?id=111 HTTP/1.1
User-Agent: Fiddler
Host: localhost:8000
Content-Type: application/json
Content-Length: 6

"test"

Wenn ein Parameter über [FromBody] verfügt, verwendet die Web-API den Content-Type-Header einen Formatierer auswählen. In diesem Beispiel lautet der Inhaltstyp "application/json" und der Anforderungstext ist eine unformatierte JSON-Zeichenfolge (kein JSON-Objekt).

Im obigen Beispiel ist kein Modell erforderlich, wenn die Daten im richtigen Format im Hauptteil bereitgestellt werden.

Für eine URL-codierte Datei würde eine Anfrage so aussehen

POST http://localhost:8000/Edit/Test?id=111 HTTP/1.1
User-Agent: Fiddler
Host: localhost:8000
Content-Type: application/x-www-form-urlencoded
Content-Length: 5

=test
32
Nkosi

Wenn das Attribut [FromBody] vorhanden ist, sollte die gesendete Zeichenfolge keine unformatierte Zeichenfolge sein, sondern eine JSON-Zeichenfolge, da sie die Anführungszeichen enthält: 

"test"

Basierend auf https://weblog.west-wind.com/posts/2017/Sep/14/Accepting-Raw-Request-Body-Content-in-ASPNET-Core-API-Controllers

Ähnliche Antwort Zeichenfolgewert ist leer, wenn FromBody in asp.net web api verwendet wird.

 

11

Du bist auf dem richtigen Weg. 

In Ihrem Kopfsatz

Content-Type: application/x-www-form-urlencoded

Der Body der POST - Anfrage sollte =test sein und nichts anderes. Für unbekannte/variable Zeichenfolgen müssen Sie den Wert URL-kodieren, damit Sie nicht versehentlich mit einem Eingabezeichen umgehen.


Siehe auch POST - Zeichenfolge in ASP.NET Web Api-Anwendung - gibt null zurück

5
Igor

Ich weiß, dass diese Antwort ziemlich alt ist und es gibt einige sehr gute Antworten, die das Problem bereits lösen. 

Um das Thema zu erweitern, möchte ich noch etwas erwähnen, das mich in den letzten 4 oder 5 Stunden verrückt gemacht hat.


Es ist SEHR SEHR sehr wichtig, dass Ihre Eigenschaften in Ihrer Modellklasse das Attribut set aktiviert haben.


Dieses WILL NOT funktioniert (Parameter immer noch null):

/* Action code */
[HttpPost]
public Weird NOURLAuthenticate([FromBody] Weird form) {
    return form;
}
/* Model class code */
public class Weird {
    public string UserId {get;}
    public string UserPwd {get;}
}

Dieses WIRD funktionieren:

/* Action code */
[HttpPost]
public Weird NOURLAuthenticate([FromBody] Weird form) {
    return form;
}
/* Model class code */
public class Weird {
    public string UserId {get; set;}
    public string UserPwd {get; set;}
}
2

In meinem Fall habe ich vergessen, .__ zu verwenden. JSON.stringify (bodyStuff).

1
Eugene

Veröffentlichen Sie die Zeichenfolge mit Raw-JSON, und vergessen Sie die doppelten Anführungszeichen nicht!

enter image description here

0
Mohammad Alqerm

Endlich funktionierte es nach 1-stündigem Kampf.

Dadurch wird das NULL-Problem entfernt und der JSON key1 - Wert von value1 wird auf generische Weise (keine Modellbindung),.

Für ein neues WebApi 2-Anwendungsbeispiel:

Postbote (sieht genau wie unten aus):

POST    http://localhost:61402/api/values   [Send]

              Body
                   (*) raw             JSON (application/json) v

"{  \"key1\": \"value1\" }"

Der Port 61402 oder url/api/values ​​darüber kann für Sie unterschiedlich sein.

ValuesController.cs

using Newtonsoft.Json;
// ..

// POST api/values
[HttpPost]
public object Post([FromBody]string jsonString)
{
    // add reference to Newtonsoft.Json
    //  using Newtonsoft.Json;

    // jsonString to myJsonObj
    var myJsonObj = JsonConvert.DeserializeObject<Dictionary<string, dynamic>>(jsonString);

    // value1 is myJsonObj[key1]
    var valueOfkey1 = myJsonObj["key1"];

    return myJsonObj;
}

Alles gut für jetzt, nicht sicher, ob die Modellbindung an eine Klasse erforderlich ist, wenn ich über Unterschlüssel verfügt oder DeserializeObject für den Unterschlüssel funktioniert.

Nach einem langen Albtraum, in dem ich mit Google herumgespielt und den falschen Code in Stack Overflow ausprobiert hatte, stellte ich fest, dass das Ändern von ([FromBody] -Stringmodell) zu ([FromBody] -Objektmodell) Wunder bewirkt, bitte nicht. Ich verwende .NET 4.0. Ja, ja, ich weiß es ist alt aber ...

0