web-dev-qa-db-fra.com

Envoyer une demande de publication HTTP dans Xamarin Forms C #

Avant de commencer, je voudrais dire que j'ai trouvé des solutions googlé à ce problème mais que je ne les ai pas comprises (je suis un débutant) ou qu'elles ne fonctionnent pas.

Ce que je veux faire, c'est envoyer des données JSON à une API REST sur localhost: 8000, dans ce format:

{
    "username" : "myusername",
    "password" : "mypass"
}

Ensuite, j'attends une réponse qui contient un jeton de chaîne, comme le suivant,

{
    "token" : "rgh2ghgdsfds"
}

Comment envoyer les données json puis analyser le jeton de la réponse? J'ai vu des méthodes synchrones pour le faire, mais pour une raison quelconque, elles ne fonctionnent pas (ou tout simplement parce que je ne sais pas dans quel espace de noms il se trouve). Si vous appliquez une méthode asynchrone, pourriez-vous s'il vous plaît m'expliquer comment cela fonctionne?

Merci d'avance.

10
alexcons

J'utilise HttpClient . Un exemple simple:

var client = new HttpClient();
client.BaseAddress = new Uri("localhost:8080");

string jsonData = @"{""username"" : ""myusername"", ""password"" : ""mypassword""}"

var content = new StringContent (jsonData, Encoding.UTF8, "application/json");
HttpResponseMessage response = await client.PostAsync("/foo/login", content);

// this result string should be something like: "{"token":"rgh2ghgdsfds"}"
var result = await response.Content.ReadAsStringAsync();

"/foo/login" devra pointer vers votre ressource HTTP. Par exemple, si vous avez une AccountController avec une méthode Login, alors au lieu de "/foo/login" vous utiliseriez quelque chose comme "/Account/Login".

En général cependant, pour gérer la sérialisation et la désérialisation, je recommande d'utiliser un outil comme Json.Net .

Quant à la question de savoir comment cela fonctionne, il se passe beaucoup de choses ici. Si vous avez des questions sur le fonctionnement de la fonction asynchrone/attente, je vous suggère de lire Programmation asynchrone avec Async et Await sur MSDN

14
Jacob Shanley

Cela devrait être assez facile avec HttpClient.

Quelque chose comme ça pourrait fonctionner. Cependant, vous devrez peut-être en quelque sorte proxy des données de l'appareil/simulateur pour atteindre votre serveur.

var client = new HttpClient();
var content = new StringContent(
    JsonConvert.SerializeObject(new { username = "myusername", password = "mypass" }));
var result = await client.PostAsync("localhost:8080", content).ConfigureAwait(false);
if (result.IsSuccessStatusCode)
{
    var tokenJson = await result.Content.ReadAsStringAsync();
}

Ce code irait probablement dans une méthode avec la signature suivante:

private async Task<string> Login(string username, string password)
{
    // code
}

Attention à utiliser void au lieu de Task comme type de retour. Si vous faites cela et qu'une exception est levée à l'intérieur de la méthode, cette exception ne sortira pas et ne sera pas gérée; cela fera exploser l'application. La meilleure pratique consiste à utiliser void uniquement lorsque nous sommes à l'intérieur d'un événement ou similaire. Dans ces cas, assurez-vous de gérer correctement toutes les exceptions possibles.

L'exemple ci-dessus utilise également HttpClient de System.Net.HttpClient. Certains profils PCL ne comprennent pas cela. Dans ces cas, vous devez ajouter bibliothèque HttpClient de Microsoft de Nuget . J'utilise également JSON.Net (Newtonsoft.Json) pour sérialiser l'objet avec nom d'utilisateur et mot de passe.

Je voudrais également noter que l'envoi d'un nom d'utilisateur et d'un mot de passe en texte clair comme celui-ci n'est pas vraiment recommandé et devrait être fait autrement.

EDIT: Si vous utilisez .NET Standard sur la plupart des versions, vous n'aurez plus besoin d'installer System.Net.HttpClient depuis NuGet, car il est déjà livré avec.

7
Cheesebaron