J'essaie de me connecter à une api, qui retourne du JSON codé GZip, à partir d'un service WCF (service WCF vers service WCF). J'utilise le HTTPClient pour me connecter à l'API et j'ai pu renvoyer l'objet JSON sous forme de chaîne. Cependant, je dois pouvoir stocker ces données retournées dans une base de données et, en tant que tel, j'ai pensé que le meilleur moyen serait de retourner et de stocker l'objet JSON dans un tableau ou un octet ou quelque chose du genre.
Ce qui me pose des problèmes en particulier, c'est la décompression de l'encodage GZip et j'ai essayé de nombreux exemples différents, mais je n'arrive toujours pas à l'obtenir.
Le code ci-dessous explique comment j'établis ma connexion et j'obtiens une réponse, c'est le code qui renvoie une chaîne de l'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 "";
}
}
J'ai suivi quelques exemples différents comme ces API StackExchange , MSDN et sur stackoverflow, mais je n'ai pas réussi à faire fonctionner l'un de ces derniers.
Quelle est la meilleure façon d'y parvenir, suis-je même sur la bonne voie?
Merci les gars.
Réponses:
Instanciez simplement HttpClient comme ceci:
Mise à jour du 19 juin 2020: il n'est pas recommandé d'utiliser httpclient dans un bloc `` using '' car cela pourrait entraîner l'épuisement du port.
Si vous utilisez .Net Core 2.1+, pensez à utiliser IHttpClientFactory et à injecter comme ceci dans votre code de démarrage.
la source
HttpClient
Ne doit PAS être utilisé à l'intérieurusing
Ok donc j'ai finalement résolu mon problème. S'il y a de meilleures façons, veuillez me le faire savoir :-)
Le RootObject contient l'ensemble d'obtention qui obtiendra les valeurs du JSON.
Le moyen le plus simple de créer la ou les classes ci-dessus est d'utiliser json2charp qui le formatera en conséquence et fournira également les types de données corrects.
Ce qui suit provient d'une autre réponse sur Stackoverflow à nouveau, il ne prend pas en compte le JSON imbriqué.
Puis enfin pour insérer l'ensemble de données ci-dessus dans une table avec des colonnes qui ont été mappées au JSON, j'ai utilisé la copie en bloc SQL et la classe suivante
Donc, ce qui précède fonctionne pour insérer JSON d'une webAPI dans une base de données. C'est quelque chose que je me mets au travail. Mais je ne m'attends en aucun cas à ce qu'il soit parfait. Si vous avez des améliorations, veuillez les mettre à jour en conséquence.
la source
HttpClient
et votreHttpResponse
intérieur uneusing()
déclaration chacun pour assurer l'élimination et la fermeture appropriées et en temps opportun des flux sous-jacents.J'ai utilisé le code du lien ci-dessous pour décompresser le flux GZip, puis j'ai utilisé le tableau d'octets décompressé pour obtenir l'objet JSON requis. J'espère que cela peut aider quelqu'un.
https://www.dotnetperls.com/decompress
la source