wake-up-neo.com

Wie verwende ich HttpClient PostAsync-Parameter richtig?

Daher arbeite ich daran, mit HttpClient eine Erweiterungsklasse für mein Projekt zu schreiben, da ich von HttpWebRequest übergegangen bin.

Wie sende ich bei der Anforderung POST eine normale Zeichenfolge als Parameter? Kein Json oder irgendetwas anderes, nur eine einfache Zeichenfolge.

Und so sieht es bisher aus.

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;
        }
    }

Wenn du dir das so anschaust

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

Sie können sehen, dass ich gerade versucht habe, einen neuen StringContent zu erstellen und einen String an diesen zu übergeben, und dass die Antwort 404 Seite nicht gefunden wurde. Wie verwende ich Post.Async () richtig? sende ich eine Zeichenfolge oder ein Byte-Array? Denn mit HttpWebRequest würden Sie es so machen

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

In der PostRequest wird folgendes gemacht ..

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

Welche erfasst nicht die Antwort des POST.

Refactor zu

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 ist in erster Linie für die asynchrone Verwendung gedacht

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

Ich habe das folgende gearbeitet (mit dem Paket Ngonzalez.ImageProcessorCore).

Abfrage (ASP.NET Core 2-Controller):

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 (ASP.NET Core 2 Controller):

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();
}