Estou tentando me conectar a uma api, que retorna JSON codificado em GZip, de um serviço WCF (serviço WCF para serviço WCF). Estou usando o HTTPClient para me conectar à API e consigo retornar o objeto JSON como uma string. No entanto, preciso ser capaz de armazenar esses dados retornados em um banco de dados e, como tal, descobri que a melhor maneira seria retornar e armazenar o objeto JSON em uma matriz ou byte ou algo semelhante.
O que estou tendo problemas especificamente é a descompactação da codificação GZip e tenho tentado muitos exemplos diferentes, mas ainda não consigo entendê-los.
O código abaixo é como estou estabelecendo minha conexão e obtendo uma resposta, este é o código que retorna uma string da API.
public string getData(string foo)
{
string url = "";
HttpClient client = new HttpClient();
HttpResponseMessage response;
string responseJsonContent;
try
{
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
response = client.GetAsync(url + foo).Result;
responseJsonContent = response.Content.ReadAsStringAsync().Result;
return responseJsonContent;
}
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.Message);
return "";
}
}
Tenho seguido alguns exemplos diferentes, como a API StackExchange , MSDN e alguns sobre stackoverflow, mas não consegui fazer nenhum deles funcionar para mim.
Qual é a melhor maneira de fazer isso, estou no caminho certo?
Obrigado rapazes.
Respostas:
Apenas instancie HttpClient assim:
Atualização de 19 de junho de 2020: Não é recomendado usar httpclient em um bloco 'usando', pois pode causar o esgotamento da porta.
Se estiver usando .Net Core 2.1+, considere usar IHttpClientFactory e injetar assim no seu código de inicialização.
fonte
HttpClient
NÃO deve ser usado dentrousing
Usei o código do link abaixo para descompactar o fluxo GZip. Em seguida, usei a matriz de bytes descompactada para obter o objeto JSON necessário. Espero que possa ajudar alguém.
https://www.dotnetperls.com/decompress
fonte
Ok, então resolvi meu problema. Se houver maneiras melhores, por favor me avise :-)
O RootObject contém o get set que obterá os valores do JSON.
A maneira mais fácil de criar a (s) classe (s) acima é usar json2charp, que irá formatá-la de acordo e também fornecer os tipos de dados corretos.
O seguinte é de outra resposta no Stackoverflow, novamente, não leva em consideração JSON aninhado.
Então, finalmente, para inserir o conjunto de dados acima em uma tabela com colunas que foram mapeadas para o JSON, usei a cópia em massa de SQL e a classe seguinte
Portanto, o acima funciona para inserir JSON de um webAPI em um banco de dados. Isso é algo que eu começo a trabalhar. Mas de forma alguma espero que seja perfeito. Se você tiver alguma melhoria, atualize-o de acordo.
fonte
HttpClient
e suaHttpResponse
internausing()
para garantir o descarte adequado e oportuno e o fechamento dos fluxos subjacentes.