2016-11-28 3 views
9

Dies ist wahrscheinlich etwas sehr einfaches, aber ich habe Schwierigkeiten herauszufinden, wo ich falsch liege.FromBody Zeichenfolge Parameter gibt Null

Ich versuche, eine Zeichenfolge aus dem Körper eines POST zu greifen, aber "jsonString" wird nur als Null angezeigt. Ich möchte auch vermeiden, ein Modell zu verwenden, aber vielleicht ist das nicht möglich. Das Stück Code, das ich mit PostMan am Schlagen ist diese Brocken:

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

Vielleicht ist es etwas, das ich mit Postbote falsch mache, aber ich habe versucht, „= test“ zu verwenden (wie in anderen Fragen gesehen gefragt zu diesem Thema) in der Wert-Sektion des Körpers - x-www-form-urlencoded Abschnitt mit dem Schlüssel als jsonString und nichts. Ich habe auch versucht, rohen Text und rohen Text/plain zu verwenden. Ich bekomme die ID, damit ich weiß, dass die URL korrekt ist. Jede Hilfe mit diesem würde sehr geschätzt werden.

PostMan ist derzeit wie folgt aufgebaut:

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

Können Sie bitte Ihre vollständige http Anfrage einschließlich URL & Körper in Ihrer Frage. –

+0

Mindestens 'Request.Content.ReadAsStringAsync()' sollte funktionieren. – Fabio

+1

Ich glaube, das ist möglich. Setze deine Kopfzeile 'Content-Type: application/x-www-form-urlencoded'. Körper sollte "= Test" sein (nichts anderes). – Igor

Antwort

12

den jsonString Parameter mit [FromBody] Sie sagen, ASP.NET-Core Durch die Deklaration den Eingangsformatierer zu verwenden, um den zur Verfügung gestellt JSON (oder XML) zu einem Modell zu binden. So sollte Ihr Test arbeiten, wenn Sie

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

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

ein einfaches Modell Klasse bieten und eine gesendete JSON wie

{ 
    key: "value" 
} 

Natürlich können Sie das Modell überspringen verbindlich und rufen Sie die zur Verfügung gestellten Daten direkt durch den Zugriff auf HttpContext.Request in Der Controller. Die-Eigenschaft gibt Ihnen den Content-Stream oder Sie können auf die Formulardaten über HttpContext.Request.Forms zugreifen.

Ich persönlich bevorzuge die Modellbindung wegen der Typensicherheit.

+1

In Frage wurde erwähnt: _Ich möchte auch vermeiden, ein Modell zu verwenden _... – Fabio

+1

@Fabio - dann [FromBody] wird nicht funktionieren, da es das Framework, das Sie die Daten an eine Modellklasse binden möchten. Um die Bindung zu vermeiden, überspringen Sie diesen Parameter und greifen Sie direkt auf die gesendeten Daten zu, wie im letzten Absatz angedeutet. Hoffe das wird helfen. –

2

Sie sind auf dem richtigen Weg.

Auf dem Header gesetzt

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

Der Körper der POST-Anforderung sollte sonst =test und nichts werden. Bei unbekannten/variablen Strings müssen Sie den Wert so codieren, dass Sie nicht versehentlich mit einem Eingabezeichen entkommen.


Siehe auch POST string to ASP.NET Web Api application - returns null

12

Referenzierung Parameter Binding in ASP.NET Web API

mit [FromBody]

Um Web-API zu zwingen, eine einfache Art von der Anfrage Körper zu lesen, fügen Sie die [FromBody] Attribut zum Parameter:

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

In diesem Beispiel wird Web API einen Medientyp-Formatierer verwenden, um den Wert von jsonString vom Anforderungstext zu lesen. Hier ist ein Beispiel Client Anfrage.

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 hat [FromBody], Web-API verwendet den Content-Type-Header einen Formatierer auszuwählen. In diesem Beispiel lautet der Inhaltstyp "application/json" und der Anfragetext ist eine unverarbeitete JSON-Zeichenfolge (kein JSON-Objekt ).

Im obigen Beispiel wird kein Modell benötigt, wenn die Daten im richtigen Format im Body bereitgestellt werden.

Für URL-kodiert einer Anfrage wie diese

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 
+1

Genau! Das wenig = löst das Problem. Ich erinnere mich, dass ich viele Tage gebraucht habe, um an meinem ersten Projekt zu arbeiten, weil es in keinem meiner Web-Api-Bücher erwähnt wurde. :( –