Ich habe eine Webanforderung, die ordnungsgemäß funktioniert, aber nur den Status OK zurückgibt, aber ich benötige das Objekt, das ich für die Rückgabe anfordere. Ich bin nicht sicher, wie ich den von mir angeforderten JSON-Wert erhalten soll. Ich bin neu in der Verwendung des Objekts HttpClient. Gibt es eine Eigenschaft, die mir fehlt? Ich brauche das zurückkehrende Objekt wirklich. Vielen Dank für jede Hilfe
Anruf tätigen - läuft gut, gibt den Status OK zurück.
HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Accept
.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var responseMsg = client.GetAsync(string.Format("http://localhost:5057/api/Photo")).Result;
Die API-Get-Methode
//Cut out alot of code but you get the idea
public string Get()
{
return JsonConvert.SerializeObject(returnedPhoto);
}
c#
httpwebrequest
user516883
quelle
quelle
Antworten:
Wenn Sie in .NET 4.5 auf System.Net.HttpClient verweisen, können Sie den von GetAsync zurückgegebenen Inhalt mithilfe der Eigenschaft HttpResponseMessage.Content als von HttpContent abgeleitetes Objekt abrufen. Anschließend können Sie den Inhalt mit der Methode HttpContent.ReadAsStringAsync oder als Stream mit der Methode ReadAsStreamAsync in eine Zeichenfolge einlesen .
Die Dokumentation zur HttpClient- Klasse enthält dieses Beispiel:
HttpClient client = new HttpClient(); HttpResponseMessage response = await client.GetAsync("http://www.contoso.com/"); response.EnsureSuccessStatusCode(); string responseBody = await response.Content.ReadAsStringAsync();
quelle
client.GetStringAsync(...)
? Gab es das nicht im Jahr 2012. Beide würden eine Ausnahme auslösen, wenn die Antwort nicht200
richtig wäre?GetStringAsync
was bedeutet, dass Sie nicht wissen, wie die Antwortnachricht lautete. Sie möchten wahrscheinlich nicht werfen, wenn eine 3xx-Antwort zurückgegeben wird. Sie möchten es wahrscheinlich erneut versuchen, ohne zu werfen, wenn ein Drosselungsfehler zurückgegeben wird.GetAsync<T>
? Oder GetStreamAsync und den Stream an Json.NET übergeben, wobei die temporäre Zeichenfolge vermieden wird? Auch hier kann es vorzuziehen sein,GetAsync
zuerst zu verwenden und dann auf dasAufbauend auf der Antwort von @Panagiotis Kanavos finden Sie hier eine Arbeitsmethode als Beispiel, die die Antwort auch als Objekt anstelle einer Zeichenfolge zurückgibt :
using System.Text; using System.Net.Http; using System.Threading.Tasks; using Newtonsoft.Json; // Nuget Package public static async Task<object> PostCallAPI(string url, object jsonObject) { try { using (HttpClient client = new HttpClient()) { var content = new StringContent(jsonObject.ToString(), Encoding.UTF8, "application/json"); var response = await client.PostAsync(url, content); if (response != null) { var jsonString = await response.Content.ReadAsStringAsync(); return JsonConvert.DeserializeObject<object>(jsonString); } } } catch (Exception ex) { myCustomLogger.LogException(ex); } return null; }
Beachten Sie, dass dies nur ein Beispiel ist und dass Sie es wahrscheinlich
HttpClient
als gemeinsam genutzte Instanz verwenden möchten, anstatt es in einer using-Klausel zu verwenden.quelle
if (response != null)
ausgeführt wird, bevor der Post-Call abgeschlossen ist?Installieren Sie dieses Nuget-Paket von Microsoft
System.Net.Http.Json
. Es enthält Erweiterungsmethoden.Dann füge hinzu
using System.Net.Http.Json
Jetzt können Sie diese Methoden sehen:
So können Sie jetzt Folgendes tun:
await httpClient.GetFromJsonAsync<IList<WeatherForecast>>("weatherforecast");
Quelle: https://www.stevejgordon.co.uk/sending-and-receiving-json-using-httpclient-with-system-net-http-json
quelle
Ich denke, der kürzeste Weg ist:
var client = new HttpClient(); string reqUrl = $"http://myhost.mydomain.com/api/products/{ProdId}"; var prodResp = await client.GetAsync(reqUrl); if (!prodResp.IsSuccessStatusCode){ FailRequirement(); } var prods = await prodResp.Content.ReadAsAsync<Products>();
quelle
Was ich normalerweise mache, ähnlich wie bei einer Antwort:
var response = await httpClient.GetAsync(completeURL); // http://192.168.0.1:915/api/Controller/Object if (response.IsSuccessStatusCode == true) { string res = await response.Content.ReadAsStringAsync(); var content = Json.Deserialize<Model>(res); // do whatever you need with the JSON which is in 'content' // ex: int id = content.Id; Navigate(); return true; } else { await JSRuntime.Current.InvokeAsync<string>("alert", "Warning, the credentials you have entered are incorrect."); return false; }
Wobei 'model' Ihre C # -Modellklasse ist.
quelle
Es funktioniert gut für mich auf folgende Weise -
public async Task<object> TestMethod(TestModel model) { try { var apicallObject = new { Id= model.Id, name= model.Name }; if (apicallObject != null) { var bodyContent = JsonConvert.SerializeObject(apicallObject); using (HttpClient client = new HttpClient()) { var content = new StringContent(bodyContent.ToString(), Encoding.UTF8, "application/json"); content.Headers.ContentType = new MediaTypeHeaderValue("application/json"); client.DefaultRequestHeaders.Add("access-token", _token); // _token = access token var response = await client.PostAsync(_url, content); // _url =api endpoint url if (response != null) { var jsonString = await response.Content.ReadAsStringAsync(); try { var result = JsonConvert.DeserializeObject<TestModel2>(jsonString); // TestModel2 = deserialize object } catch (Exception e){ //msg throw e; } } } } } catch (Exception ex) { throw ex; } return null; }
quelle