2017-12-22 5 views
2

그래서 HttpWebRequest에서 이전 중이므로 HttpClient를 사용하여 내 프로젝트의 확장 클래스를 작성하고 있습니다.HttpClient PostAsync 매개 변수를 올바르게 사용하려면 어떻게해야합니까?

POST 요청을 할 때 매개 변수로 일반 문자열을 보내려면 어떻게해야합니까? 아니 json 또는 아무것도 간단한 문자열.

그리고 이것은 지금까지와 같이 보입니다. 당신이

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

처럼이 보면

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

당신은 그냥 새로운 StringContent를 만들고 여기에 문자열을 전달하려고 것을 볼 수 있으며, 응답은 404 페이지를 찾을 수 없음 돌아왔다. Post.Async()를 올바르게 사용하려면 어떻게해야합니까? 문자열 또는 바이트 배열을 보내려면 어떻게해야합니까? HttpWebRequest를 사용하면 .. 완료되어 다음 PostRequest

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

처럼 할 것 때문에

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

게시물의 응답을 캡처하지 않습니다.

리팩터링

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는 주로 그래서 다음 (패키지 Ngonzalez.ImageProcessorCore 사용) 내가 일한

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

는 어떻게 반환 문자열의 연락을 취하는 잡아 않는다 ? –

+0

@AleksSlade는 요청이 이루어지는 컨텍스트에 따라 다릅니다. 비동기 호출을 수행하는 방법에 대한 규칙을 적용하십시오. 'var result = HttpClientExtension.PostRequestAsync ("URL here", "Params Here")를 기다린다.' – Nkosi

0

에 리팩토링을 고려 비동기 사용하기위한 것입니다.

쿼리 (ASP.NET 코어 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 광고 (ASP.NET 코어 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(); 
} 
관련 문제