Tenho uma solicitação da Web que está funcionando corretamente, mas está apenas retornando o status OK, mas preciso que o objeto que estou pedindo para retornar. Não tenho certeza de como obter o valor json que estou solicitando. Eu sou novo no uso do objeto HttpClient, há uma propriedade que estou perdendo? Eu realmente preciso do objeto de retorno. Obrigado por qualquer ajuda
Fazendo a chamada - corre bem retorna o 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;
O método api get
//Cut out alot of code but you get the idea
public string Get()
{
return JsonConvert.SerializeObject(returnedPhoto);
}
c#
httpwebrequest
user516883
fonte
fonte
Respostas:
Se você estiver se referindo ao System.Net.HttpClient no .NET 4.5, poderá obter o conteúdo retornado por GetAsync usando a propriedade HttpResponseMessage.Content como um objeto derivado de HttpContent . Você pode então ler o conteúdo em uma string usando o método HttpContent.ReadAsStringAsync ou como um fluxo usando o método ReadAsStreamAsync .
A documentação da classe HttpClient inclui este exemplo:
HttpClient client = new HttpClient(); HttpResponseMessage response = await client.GetAsync("http://www.contoso.com/"); response.EnsureSuccessStatusCode(); string responseBody = await response.Content.ReadAsStringAsync();
fonte
client.GetStringAsync(...)
? Isso não existia em 2012. Ambos lançariam uma exceção se a resposta não fosse200
correta?GetStringAsync
que significa que você não sabe qual foi a mensagem de resposta. Você provavelmente não deseja lançar se uma resposta 3xx for retornada. Você provavelmente deseja tentar novamente sem lançar se um erro de limitação for retornado.GetAsync<T>
? Ou GetStreamAsync e passar o stream para Json.NET, evitando a string temporária? Novamente, pode ser preferível usarGetAsync
primeiro e depois acessar o objeto de conteúdoCom base na resposta de @Panagiotis Kanavos , aqui está um método de trabalho como exemplo que também retornará a resposta como um objeto em vez de uma 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; }
Lembre-se de que este é apenas um exemplo e que você provavelmente gostaria de usar
HttpClient
como uma instância compartilhada em vez de usá-la em uma cláusula de uso.fonte
if (response != null)
seja executado antes que a pós-chamada seja concluída?Instale este pacote nuget da Microsoft
System.Net.Http.Json
. Ele contém métodos de extensão.Então adicione
using System.Net.Http.Json
Agora, você poderá ver estes métodos:
Então agora você pode fazer isso:
await httpClient.GetFromJsonAsync<IList<WeatherForecast>>("weatherforecast");
Fonte: https://www.stevejgordon.co.uk/sending-and-receiving-json-using-httpclient-with-system-net-http-json
fonte
Acho que o caminho mais curto é:
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>();
fonte
O que eu normalmente faço, semelhante a uma resposta:
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; }
Onde 'modelo' é sua classe de modelo C #.
fonte
Está funcionando bem para mim da seguinte maneira -
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; }
fonte