2013-10-16 6 views
16

Ich habe diese sehr einfache C# APIController dem Namen "Testcontroller" mit einer API-Methode wie:Fiddler Test API Beitrag vorbei a [Frombody] Klasse

[HttpPost] 
public string HelloWorld([FromBody] Testing t) 
{ 
    return t.Name + " " + t.LastName; 
} 

Kontakt nur eine Klasse, die wie folgt aussehen:

public class Testing 
{ 
    [Required] 
    public string Name; 
    [Required] 
    public string LastName; 
} 

sieht mein APIRouter wie folgt aus:

config.Routes.MapHttpRoute(
    name: "TestApi", 
    routeTemplate: "api/{controller}/{action}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
); 

FRAGE 1:
Wie kann ich das von einem C# -Client aus testen?

für 2 # habe ich versucht, den folgenden Code:

private async Task TestAPI() 
{ 
    var pairs = new List<KeyValuePair<string, string>> 
    { 
     new KeyValuePair<string, string>("Name", "Happy"), 
     new KeyValuePair<string, string>("LastName", "Developer") 
    }; 

    var content = new FormUrlEncodedContent(pairs); 

     var client = new HttpClient();       
     client.DefaultRequestHeaders.Accept.Add(
      new MediaTypeWithQualityHeaderValue("application/json")); 

     var result = await client.PostAsync( 
      new Uri("http://localhost:3471/api/test/helloworld", 
        UriKind.Absolute), content); 

     lblTestAPI.Text = result.ToString(); 
    } 

FRAGE 2:
Wie kann ich das von Fiddler testen?
Es scheint nicht möglich zu sein, eine Klasse über die Benutzeroberfläche zu übergeben.

Antwort

26

Für Frage 1: Ich würde den POST aus dem .NET-Client wie folgt implementieren. Hinweis Sie müssen Bezug auf die folgenden Baugruppen hinzuzufügen: a) System.Net.Http b) System.Net.Http.Formatting

public static void Post(Testing testing) 
    { 
     HttpClient client = new HttpClient(); 
     client.BaseAddress = new Uri("http://localhost:3471/"); 

     // Add an Accept header for JSON format. 
     client.DefaultRequestHeaders.Accept.Add(
      new MediaTypeWithQualityHeaderValue("application/json")); 

     // Create the JSON formatter. 
     MediaTypeFormatter jsonFormatter = new JsonMediaTypeFormatter(); 

     // Use the JSON formatter to create the content of the request body. 
     HttpContent content = new ObjectContent<Testing>(testing, jsonFormatter); 

     // Send the request. 
     var resp = client.PostAsync("api/test/helloworld", content).Result; 

    } 

Ich würde auch die Controller-Methode wie folgt umschreiben:

[HttpPost] 
public string HelloWorld(Testing t) //NOTE: You don't need [FromBody] here 
{ 
    return t.Name + " " + t.LastName; 
} 

Für Frage 2: in Fiddler das verb im Dropdown ändern von GET zu POST und im JSON Darstellung des Objekts in der Anfrage Körper

setzen

+0

Leider, wenn ich [FromBody] entfernen, findet der Fiddler es nicht und erhält einen 404. Der C# -Client-Code erhält auf keine Weise eine Antwort. –

+0

[FromBody] wird benötigt, wenn Sie einen Content-Type: application/json übergeben. Wenn Sie das entfernen, müssen Sie einen Inhaltstyp übergeben: application/x-www-form-urlencoded –

+0

Gibt es einen Grund, warum Sie URL-codierten Inhalt verwenden, anstatt "Content-type: application.json" zu verwenden, was aktiviert die Nutzlast im Körper angeben? Bei komplexen Typen möchten Sie den Rumpf und nicht die Abfragezeichenfolge verwenden. Haben Sie mehrere POST-Aktionen in Ihrem Controller definiert? Können Sie den vollständigen Controller-Code veröffentlichen? –