How do I use HttpClient PostAsync parameters properly?
所以我正在使用HttpClient为我的项目编写扩展类,因为我是从HttpWebRequest移过来的。
在执行POST请求时,如何发送普通字符串作为参数? 没有json或其他任何简单字符串。
这就是到目前为止的样子。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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; } } |
如果你这样看
1 |
您可以看到我只是尝试创建新的StringContent并将一个字符串传递给它,并且返回的响应未找到404页面。
如何正确使用Post.Async(); 发送字符串或字节数组? 因为使用HttpWebRequest,您会像这样
1 2 3 4 5 6 7 8 | 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); } |
在
1 2 | client.PostAsync(URI, new StringContent(PostParams)); HttpResponseMessage response = client.GetAsync(URI).GetAwaiter().GetResult(); |
哪个不捕获POST的响应。
重构为
1 2 3 4 5 | 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; } |
1 2 3 4 5 | 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; } |
我已经做了以下工作(使用软件包Ngonzalez.ImageProcessorCore)。
查询(ASP.NET Core 2控制器):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | 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控制器):
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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(); } |