Wie zu Lesen webapi Antworten mit HttpClient in C#
Ich ziemlich neu bin, webapi und entwickelt haben, eine kleine webapi, die hat ein paar Aktionen und gibt meine eigene Klasse namens Response.
Die Response
Klasse
public class Response
{
bool IsSuccess=false;
string Message;
object ResponseData;
public Response(bool status, string message, object data)
{
IsSuccess = status;
Message = message;
ResponseData = data;
}
}
Meine webapi mit Aktionen
[RoutePrefix("api/customer")]
public class CustomerController : ApiController
{
static readonly ICustomerRepository repository = new CustomerRepository();
[HttpGet, Route("GetAll")]
public Response GetAllCustomers()
{
return new Response(true, "SUCCESS", repository.GetAll());
}
[HttpGet, Route("GetByID/{customerID}")]
public Response GetCustomer(string customerID)
{
Customer customer = repository.Get(customerID);
if (customer == null)
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
return new Response(true, "SUCCESS", customer);
//return Request.CreateResponse(HttpStatusCode.OK, response);
}
[HttpGet, Route("GetByCountryName/{country}")]
public IEnumerable<Customer> GetCustomersByCountry(string country)
{
return repository.GetAll().Where(
c => string.Equals(c.Country, country, StringComparison.OrdinalIgnoreCase));
}
}
Jetzt, wo ich geblieben bin ist, dass ich nicht weiß, wie die Antwort Lesen von Daten zurückgegeben, die von der webapi Aktionen und extrahieren von json aus meiner Antwort-Klasse. Nach dem bekommen von json wie könnte ich deserialize
dass json auf die customer-Klasse.
Dies ist die Art, wie ich bin, ruft mein webapi-Funktion:
private void btnLoad_Click(object sender, EventArgs e)
{
HttpClient client = new HttpClient();
client.BaseAddress = new Uri("http://localhost:8010/");
//Add an Accept header for JSON format.
//client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
//List all Names.
HttpResponseMessage response = client.GetAsync("api/customer/GetAll").Result; //Blocking call!
if (response.IsSuccessStatusCode)
{
Console.WriteLine("Request Message Information:- \n\n" + response.RequestMessage + "\n");
Console.WriteLine("Response Message Header \n\n" + response.Content.Headers + "\n");
}
else
{
Console.WriteLine("{0} ({1})", (int)response.StatusCode, response.ReasonPhrase);
}
Console.ReadLine();
}
Bitte helfen, mich zu Sortieren, meinen code
1), Wie man die response-Klasse die webapi zurück an den client
Seite2) Wie könnte ich das extrahieren von json-aus der Antwort-Klasse
3) Wie Deserialisieren des json, um die customer-Klasse in der client-Seite
Dank
BEARBEITEN
Verwende ich diesen code, aber immer noch ein Fehler.
var baseAddress = "http://localhost:8010/api/customer/GetAll";
using (var client = new HttpClient())
{
using (var response = client.GetAsync(baseAddress).Result)
{
if (response.IsSuccessStatusCode)
{
var customerJsonString = await response.Content.ReadAsStringAsync();
var cust = JsonConvert.DeserializeObject<Response>(customerJsonString);
}
else
{
Console.WriteLine("{0} ({1})", (int)response.StatusCode, response.ReasonPhrase);
}
}
}
Ter error msg ist:
Eine Ausnahme des Typs " Newtonsoft.Json.JsonSerializationException'
aufgetreten in Newtonsoft.Json.dll wurde aber nicht behandelt werden, in Benutzer-codeWeitere Informationen: kann Nicht deserialisiert werden die aktuellen JSON-Objekt
(z.B. {"name":"Wert"}) in den Typ 'WebAPIClient.Antwort[]' da
die Art benötigt ein JSON-array (z.B. [1,2,3]) Deserialisieren
richtig.
Warum ist die Antwort, die diesen Fehler verursacht?
wenn ich lese, wie dieser Weg
var customerJsonString = await response.Content.ReadAsStringAsync();
dann gerade dieses symbol {}
gespeichert in customerJsonString variable. wo mache ich den Fehler?Was passiert, wenn Sie öffnen Sie Ihren browser und navigieren Sie zu: localhost:8010/api/Kunden/GetAll - stellt, die Ergebnisse zurückgeben? (D. H. die Erprobung der api ohne Ihre client-code).
Ich bin mir nicht ganz sicher, warum Sie erstellt haben, eine
Response
Klasse. Aus der API sollten Sie nur in der Lage sein, das Objekt zurückzugeben (oder in diesem Fall die Liste der Objekte) aus Ihrem repository. Auf dem client, der Sie dann gerade benötigen, um die Zeichenfolge der Antwort (JSON) über response.Content.ReadAsStringAsync();
und dann können Sie so etwas wie JsonConvert zu Deserialisieren, die Json-Zeichenfolge zu einer C# - Objekt. Sie müssten in die gleiche Klasse in der client um zu Deserialisieren zurück - vielleicht erzeugt eine shared-library, oder etwas, so können Sie importieren diese in beiden Projekten (nur ein Vorschlag)
InformationsquelleAutor Monojit Sarkar | 2016-08-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Auf dem client gehören ein Lesen der Inhalte:
Ändern Sie Ihre WebApi nicht zu verwenden, Ihre Antwort Klasse, aber eher eine
IEnumerable
vonCustomer
. Verwenden Sie dieHttpResponseMessage
Antwort-Klasse.Ihre WebAPI sollte nur verlangen:
Zusätzlichen code für eine generische Reaktion der Klasse auf der Grundlage der Diskussion in den Kommentaren, obwohl ich noch empfehlen Sie dies nicht tun und vermeiden, fordern Sie Ihre Klasse Antwort. Sie sollte lieber zurück HTTP-status-codes anstelle Ihres eigenen. Ein 200 Ok, ein 401 nicht autorisiert, etc. Auch dieser Beitrag für die Rückgabe der HTTP-status-codes.
var deserialized = JsonConvert.DeserializeObject<IEnumerable<Customer>>(customerJsonString);
Gemacht und erhalten einen +1 - vielen Dank @GeoffJames
Ich möchte wirklich vermeiden, fordern Sie Ihre Klasse Reaktion und die Rückkehr HTTP-status-codes anstelle Ihres eigenen. Ein 200 Ok, ein 401 nicht autorisiert, etc (siehe en.wikipedia.org/wiki/List_of_HTTP_status_codes). Siehe auch stackoverflow.com/questions/10655350/.... Die Fehler, die ich sehen kann, in Ihrer Antwort Klasse ist, dass die ResponseData ist ein Objekt, sollte aber ein IEnumerable<object>, alternativ ein bisschen Fortgeschrittener ist, sollte es ein IEnumerable<T> (generic).
genau das wollen Sie haben Ihre eigene Reaktion Klasse zurückgegeben? Wie ich bereits erwähnt in den Kommentaren auf OP, und Murray hat zu Recht gesagt haben - es gibt keinen Punkt; du bist nur das abstrahieren, was Sie zurückgeben, völlig unnötig. Die beste Vorgehensweise beim senden/konsumieren von API-Daten ist die Rückgabe der Sache/Liste von object aus Ihrem repository (Datenbank etc.) wo möglich und Griff unbefugte/ungültigen requests durch den HTTP-status-codes, die uniform und das ist, was Sie sind!. Sie brauchen nicht das Rad neu zu erfinden!
Für WebApi, was Sie tun sollten, ist die Rückkehr einer 400-Bad Request. Bitte Folgen Sie diesem Artikel: asp.net/web-api/overview/error-handling/exception-handling
InformationsquelleAutor Murray Foxcroft