Saya memiliki permintaan web yang berfungsi dengan baik, tetapi hanya mengembalikan status OK, tetapi saya membutuhkan objek yang saya minta untuk dikembalikan. Saya tidak yakin bagaimana cara mendapatkan nilai json yang saya minta. Saya baru menggunakan objek HttpClient, apakah ada properti yang saya lewatkan? Saya sangat membutuhkan objek yang kembali. Terima kasih atas bantuannya
Melakukan panggilan - berjalan dengan baik mengembalikan status OK.
HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Accept
.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var responseMsg = client.GetAsync(string.Format("http://localhost:5057/api/Photo")).Result;
Metode api get
//Cut out alot of code but you get the idea
public string Get()
{
return JsonConvert.SerializeObject(returnedPhoto);
}
c#
httpwebrequest
pengguna516883
sumber
sumber
Jawaban:
Jika Anda merujuk ke System.Net.HttpClient di .NET 4.5, Anda bisa mendapatkan konten yang dikembalikan oleh GetAsync menggunakan properti HttpResponseMessage.Content sebagai objek yang berasal dari HttpContent . Anda kemudian dapat membaca konten ke string menggunakan metode HttpContent.ReadAsStringAsync atau sebagai aliran menggunakan metode ReadAsStreamAsync .
The HttpClient dokumentasi kelas meliputi contoh ini:
HttpClient client = new HttpClient(); HttpResponseMessage response = await client.GetAsync("http://www.contoso.com/"); response.EnsureSuccessStatusCode(); string responseBody = await response.Content.ReadAsStringAsync();
sumber
client.GetStringAsync(...)
? Bukankah itu sekitar tahun 2012. Mereka berdua akan melakukan pengecualian jika tanggapannya tidak200
tepat?GetStringAsync
yang artinya Anda tidak tahu apa pesan respons itu. Anda mungkin tidak ingin membuang jika respons 3xx dikembalikan. Anda mungkin ingin mencoba lagi tanpa melempar jika kesalahan pembatasan kembali.GetAsync<T>
? Atau GetStreamAsync dan teruskan streaming ke Json.NET, menghindari string sementara? Sekali lagi, mungkin lebih baik untuk menggunakanGetAsync
terlebih dahulu kemudian mengakses objek kontenBerdasarkan jawaban @Panagiotis Kanavos , berikut adalah metode kerja sebagai contoh yang juga akan mengembalikan respons sebagai objek, bukan string:
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; }
Ingatlah bahwa ini hanya sebuah contoh dan Anda mungkin ingin menggunakannya
HttpClient
sebagai instance bersama daripada menggunakannya dalam klausa penggunaan.sumber
if (response != null)
dijalankan sebelum panggilan pos selesai?Instal paket nuget ini dari Microsoft
System.Net.Http.Json
. Ini berisi metode ekstensi.Lalu tambahkan
using System.Net.Http.Json
Sekarang, Anda akan dapat melihat metode ini:
Jadi sekarang Anda dapat melakukan ini:
await httpClient.GetFromJsonAsync<IList<WeatherForecast>>("weatherforecast");
Sumber: https://www.stevejgordon.co.uk/sending-and-receiving-json-using-httpclient-with-system-net-http-json
sumber
Menurut saya cara terpendek adalah:
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>();
sumber
Apa yang biasanya saya lakukan, mirip dengan yang menjawab:
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; }
Di mana 'model' adalah kelas model C # Anda.
sumber
Ini bekerja dengan baik untuk saya dengan cara berikut -
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; }
sumber