web-dev-qa-db-fra.com

Comment utiliser correctement les paramètres HttpClient PostAsync?

Je travaille donc sur l'écriture d'une classe d'extension pour mon projet en utilisant HttpClient puisque je passe de HttpWebRequest.

Lors de l'exécution de la demande POST, comment puis-je envoyer une chaîne normale en tant que paramètre? Pas de json ou quoi que ce soit juste une simple chaîne.

Et voici à quoi cela ressemble jusqu'à présent.

static class HttpClientExtension
    {
        static HttpClient client = new HttpClient();
        public static string GetHttpResponse(string URL)
        {
            string fail = "Fail";
            client.BaseAddress = new Uri(URL);
            HttpResponseMessage Response = client.GetAsync(URL).GetAwaiter().GetResult();
            if (Response.IsSuccessStatusCode)
                return Response.Content.ReadAsStringAsync().GetAwaiter().GetResult();
            else
                return fail;
        }

        public static string PostRequest(string URI, string PostParams)
        {
            client.PostAsync(URI, new StringContent(PostParams));
            HttpResponseMessage response = client.GetAsync(URI).GetAwaiter().GetResult();
            string content = response.Content.ReadAsStringAsync().GetAwaiter().GetResult();
            return content;
        }
    }

Si vous regardez ça comme

client.PostAsync(URI, new StringContent(PostParams));

Vous pouvez voir que je viens d'essayer de créer un nouveau StringContent et de lui transmettre une chaîne, et la réponse a renvoyé une page 404 non trouvée. Comment utiliser correctement Post.Async (); est-ce que j'envoie une chaîne de caractères ou un tableau d'octets? Parce qu'avec HttpWebRequest vous le feriez comme ceci

public static void SetPost(this HttpWebRequest request, string postdata)
        {
            request.Method = "POST";
            byte[] bytes = Encoding.UTF8.GetBytes(postdata);

            using (Stream requestStream = request.GetRequestStream())
                requestStream.Write(bytes, 0, bytes.Length);
        }
2
Aleks Slade

Dans la PostRequest on fait ce qui suit ..

client.PostAsync(URI, new StringContent(PostParams));
HttpResponseMessage response = client.GetAsync(URI).GetAwaiter().GetResult();

Ce qui ne capture pas la réponse du POST.

Refactor à

public static string PostRequest(string URI, string PostParams) {            
    var response = client.PostAsync(URI, new StringContent(PostParams)).GetAwaiter().GetResult();
    var content = response.Content.ReadAsStringAsync().GetAwaiter().GetResult();
    return content;
}

HttpClient est principalement destiné à être utilisé de manière asynchrone, envisagez donc de refactoriser

public static async Task<string> PostRequestAsync(string URI, string PostParams) {            
    var response = await client.PostAsync(URI, new StringContent(PostParams));
    var content = await response.Content.ReadAsStringAsync();
    return content;
}
3
Nkosi

J'ai travaillé ce qui suit (en utilisant le paquet Ngonzalez.ImageProcessorCore).

Requête (contrôleur ASP.NET Core 2):

async Task<byte[]> CreateImage(IFormFile file)
{
  using (var memoryStream = new MemoryStream())
  {
    await file.CopyToAsync(memoryStream);
    var image = new Image(memoryStream);
    var height = image.Height < 150 ? image.Height : 150;
    image.Resize((int)(image.Width * height / image.Height), height).Save(memoryStream);
    return memoryStream.ToArray();
  }
}

[HttpPost, ValidateAntiForgeryToken]
public async Task<IActionResult> ImageAdd(ImageAddVm vm)
{
  byte[] image = null;
  if (vm.File != null && vm.File.Length > 0)
     image = await CreateImage(vm.File);
  if (image != null)
  {
    var json = JsonConvert.SerializeObject(new { vm.ObjectId, image });
    var content = new StringContent(json, Encoding.UTF8, "application/json");
    var client= new HttpClient();
    await client.PostAsync($"{ApiUrl}/SaveImage", content);
  }
  return RedirectToAction("ReturnAction");
}

Api (contrôleur ASP.NET Core 2):

public class ObjectImage
{
  public int ObjectId { get; set; }
  public byte[] Image { get; set; }
}

[HttpPost("SaveImage")]
public void SaveImage([FromBody]object content)
{
  var obj = JsonConvert.DeserializeObject<ObjectImage>(content.ToString());
  _db.Images.Find(obj.ObjectId).Image = obj.Image;
  _db.SaveChanges();
}