[c#] 개체를 HttpClient.PostAsync에 전달하고 JSON 본문으로 직렬화하려면 어떻게해야합니까?

를 사용 System.Net.Http하고 있으며 웹에서 몇 가지 예를 찾았습니다. POST요청을 위해이 코드를 만들었습니다 .

public static string POST(string resource, string token)
{
    using (var client = new HttpClient())
    {
        client.BaseAddress = new Uri(baseUri);
        client.DefaultRequestHeaders.Add("token", token);

        var content = new FormUrlEncodedContent(new[]
        {
             new KeyValuePair<string, string>("", "")
        });

        var result = client.PostAsync("", content).Result;
        string resultContent = result.Content.ReadAsStringAsync().Result;
        return resultContent;
    }
 }

모두 잘 작동합니다. 그러나 세 번째 매개 변수를 POST메서드에 전달한다고 가정합니다 data. 데이터 매개 변수는 다음과 같은 객체입니다.

object data = new
{
    name = "Foo",
    category = "article"
};

만들지 않고 어떻게 할 수 KeyValuePair있습니까? 내 PHP RestAPI는 json 입력을 기다리므로 json을 올바르게 FormUrlEncodedContent보내야 raw합니다. 그러나 어떻게 이것을 할 수 Microsoft.Net.Http있습니까? 감사.



답변

귀하의 질문에 대한 정답은 아니오입니다. PostAsync방법에 대한 서명 은 다음과 같습니다.

공용 작업 PostAsync (Uri requestUri, HttpContent 콘텐츠)

당신이 통과 할 수있는 동안 따라서, objectPostAsync이 유형이어야 HttpContent하고 익명의 유형은 그 기준을 충족하지 않습니다.

그러나 원하는 것을 달성하는 방법이 있습니다. 먼저 익명 유형을 JSON으로 직렬화해야합니다 . 이를위한 가장 일반적인 도구는 Json.NET 입니다. 그리고 이것에 대한 코드는 매우 사소합니다.

var myContent = JsonConvert.SerializeObject(data);

다음으로,이 데이터를 보내기 위해 콘텐츠 개체를 구성해야합니다. 개체를 사용 ByteArrayContent하지만 원하는 경우 다른 유형을 사용하거나 만들 수 있습니다.

var buffer = System.Text.Encoding.UTF8.GetBytes(myContent);
var byteContent = new ByteArrayContent(buffer);

다음으로 API에 이것이 JSON임을 알리도록 콘텐츠 유형을 설정하려고합니다.

byteContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");

그런 다음 양식 내용을 사용하여 이전 예제와 매우 유사한 요청을 보낼 수 있습니다.

var result = client.PostAsync("", byteContent).Result

참고로 .Result여기서하는 것처럼 속성을 호출하면 데드락과 같은 나쁜 부작용 이 발생할 수 있으므로주의해야합니다.


답변

요청 본문의 데이터를 FormUrlEncodedContent. 대신 원시 문자열로 전달해야합니다 . 이를 수행하는 한 가지 방법은 JSON 문자열로 직렬화하는 것입니다.

var json = JsonConvert.SerializeObject(data); // or JsonSerializer.Serialize if using System.Text.Json

이제해야 할 일은 문자열을 post 메소드에 전달하는 것입니다.

var stringContent = new StringContent(json, UnicodeEncoding.UTF8, "application/json"); // use MediaTypeNames.Application.Json in Core 3.0+ and Standard 2.1+

var client = new HttpClient();
var response = await client.PostAsync(uri, stringContent);


답변

간단한 해결책은 NuGet 에서 사용하는 Microsoft ASP.NET Web API 2.2 Client것 입니다.

그런 다음 간단하게 수행 할 수 있으며 객체를 JSON으로 직렬화하고 Content-Type헤더를 application/json; charset=utf-8다음 과 같이 설정합니다 .

var data = new
{
    name = "Foo",
    category = "article"
};

var client = new HttpClient();
client.BaseAddress = new Uri(baseUri);
client.DefaultRequestHeaders.Add("token", token);
var response = await client.PostAsJsonAsync("", data);


답변

이제 .NET Standard또는 사용 하는 더 간단한 방법이 있습니다 .NET Core.

var client = new HttpClient();
var response = await client.PostAsync(uri, myRequestObject, new JsonMediaTypeFormatter());

참고 :JsonMediaTypeFormatter 클래스 를 사용 하려면 Microsoft.AspNet.WebApi.ClientNuGet 패키지 를 설치해야합니다. NuGet 패키지는 직접 설치하거나 Microsoft.AspNetCore.App.

이 서명을 사용하면 HttpClient.PostAsync모든 객체를 전달할 수 있으며은 JsonMediaTypeFormatter자동으로 직렬화 등을 처리합니다.

응답을 사용 HttpContent.ReadAsAsync<T>하면 응답 콘텐츠를 예상하는 유형으로 역 직렬화하는 데 사용할 수 있습니다 .

var responseObject = await response.Content.ReadAsAsync<MyResponseType>();


답변