2017-08-08 3 views
0

Ich mache eine MVC 5-Anwendung, und ich rufe eine API-Controller-Methode, die in einer anderen Lösung ist.MVC Api Controller Serialisierte Parameter

Ich verwende HttpClient(). und ich rufe PostAsJsonAsync mit einigen Parametern, eine Instanz einer Klasse.

Es sieht so aus.

string apiUrl = "localhost:8080/api/"; 
ContactWF contactWF = new contactWF(); 
contactWF.contact_id=0; 
contactWF.UserOrigin_id=20006 
contactWF.ProcessState_id=2; 

using (HttpClient client = new HttpClient()) 
{ 
    client.BaseAddress = new Uri(apiUrl); 
    client.DefaultRequestHeaders.Accept.Clear(); 
    client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json")); 
    HttpResponseMessage response = await client.PostAsJsonAsync(apiUrl + "Contact/Method", contactWF); 
    if (response.IsSuccessStatusCode) 
    { 
     return response.Content.ReadAsAsync<int>().Result; 
    } 
} 

Meine API-Controller-Methode ist wie folgt.

HttpResponseMessage response = await client.PostAsJsonAsync(apiUrl + "Contact/Method", contactWF); 

mit diesem

string jsonData = JsonConvert.SerializeObject(contactWF); 
HttpResponseMessage response = client.PostAsJsonAsync("api/Contact/Method", jsonData).Result; 

I

[ActionName("Method")] 
[HttpGet] 
public int Method([FromBody] ContactWF userwf) 
{ 
    return 10; 
} 

es funktioniert gut ...

Mein Problem ist, wenn ich Serialized der Parameter Klasseninstanz versuchen I Linie ersetzen habe eine Error:405 ...

Es sieht wie die Json Zeichenfolge aus, die es nicht als Parameter erkennt.

Meine Json-Zeichenfolge sieht so aus.

"{\"Contact_id\":0,\"Description\":null,\"ProcessState_id\":2,\"Type_id\":0,\"Object_id\":0,\"Parent_id\":null}" 

das ist ContactWD Klassenkonverter zu json.

Was ist los?

Antwort

1

Methode PostAsJsonAsync serialisiert Parameter selbst Objekt, so dass es serialisiert Ihre json String wieder.

Wenn Sie serialisiert werden müssen, sich aus irgendeinem Grund widersprechen, dann verwenden Methode HttpClient.PostAsync

string jsonData = JsonConvert.SerializeObject(contactWF); 
var stringContent = new StringContent(jsonData, Encoding.UTF8, "application/json"); 
HttpResponseMessage response = await client.PostAsync("api/Filler/CountMensajeByUser", stringContent); 
+0

Danke ... Also ich war serialzing zweimal ... aber, was ich nicht verstehe ist, dass, wenn ich PostAsJsonAsync, In api-Controller verwenden Methode Ich sollte eine Zeichenfolge erhalten?Jetzt, ich bekomme eine Instanz der gleichen Klasse ... Danke – Diego

+0

Web API Deserialize Anfrage JSON Körper zu Methode argumet Klasse. Wenn Sie es als 'public int-Methode ([FromBody] string userwf) erklären' dann funktioniert Ihre zweite Variante mit zweimal serialisierten Objekt und Sie werden in serialisierten Objekt userwf bekommen. –

1

ändern Verb Httppost in Ihrem api Controller

[ActionName("Method")] 
[HttpPost] 
public int Method([FromBody] ContactWF userwf) 
{ 
    return 10; 
} 

aktualisieren

Sie brauchen nicht Objekt zu serialisiert in PostAsJsonAsync

HttpResponseMessage response = client.PostAsJsonAsync("api/Contact/Method", contactWF).Result; 

Werfen Sie einen Blick auf Beispielcode aus Microsoft https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/testing

internal class NewIdeaDto 
    { 
     public NewIdeaDto(string name, string description, int sessionId) 
     { 
      Name = name; 
      Description = description; 
      SessionId = sessionId; 
     } 

     public string Name { get; set; } 
     public string Description { get; set; } 
     public int SessionId { get; set; } 
    } 

//Arrange 
var newIdea = new NewIdeaDto("Name", "", 1); 

// Act 
var response = await _client.PostAsJsonAsync("/api/ideas/create", newIdea); 

// Assert 
Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode); 
+0

Mit Httppost get Fehler 404. Methode Nicht gefunden ... – Diego

+0

Haben Sie auf die richtige URI posten? Ich sehe zwei verschiedene Endpunkt "Kontakt/Methode" & "api/Filler/CountMensajeByUser" –

+0

ja ... Ich habe den Namen für dieses Beispiel ersetzt ... danke .. Ich muss HttpGet setzen, sonst habe ich Fehler 404 ... Methode nicht gefunden Aber mein Hauptproblem ist serialisierte JSON ... – Diego

Verwandte Themen