2017-12-22 14 views
2

Also ich schreibe eine Erweiterungs-Klasse für mein Projekt mit HttpClient seit ich von HttpWebRequest rübergehen.Wie verwende ich HttpClient PostAsync-Parameter richtig?

Wie kann ich bei der POST-Anfrage eine normale Zeichenfolge als Parameter senden? Kein JSON oder irgendetwas 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 man sich so aussehen wie

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

können Sie sehen, dass ich gerade neuen StringContent versucht zu schaffen und einen String in quert und die Antwort zurück 404 Seite nicht gefunden. Wie verwende ich richtig Post.Async(); sende ich ein String- oder Byte-Array? Denn mit HttpWebRequest Sie es wie dieser

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

Antwort

1

Im PostRequest wird folgendes getan tun würde ..

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

Welche erfasst nicht die Antwort des POST.

Umgestalten 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 gemeint, verwendet werden, um async

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

Mit der Asynchron-Version wie packe ich ahold der Rückgabestring ? –

+0

@AleksSlade hängt vom Kontext ab, in dem die Anforderung ausgeführt wird. Wenden Sie die Regeln für das Ausführen von Async-Anrufen an. 'var result = await HttpClientExtension.PostRequestAsync (" URL hier "," Params Here ")' – Nkosi

0

Refactoring so halte ich die folgenden (unter Verwendung des Paket Ngonzalez.ImageProcessorCore) gearbeitet haben.

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