Nice programing

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

nicepro 2020. 11. 9. 21:00
반응형

개체를 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);

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

var stringContent = new StringContent(json, UnicodeEncoding.UTF8, "application/json");

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 Standardor 사용 하는 더 간단한 방법이 있습니다 .NET Core.

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

NOTE: In order to use the JsonMediaTypeFormatter class, you will need to install the Microsoft.AspNet.WebApi.Client NuGet package, which can be installed directly, or via another such as Microsoft.AspNetCore.App.

Using this signature of HttpClient.PostAsync, you can pass in any object and the JsonMediaTypeFormatter will automatically take care of serialization etc.

With the response, you can use HttpContent.ReadAsAsync<T> to deserialize the response content to the type that you are expecting:

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

참고URL : https://stackoverflow.com/questions/36625881/how-do-i-pass-an-object-to-httpclient-postasync-and-serialize-as-a-json-body

반응형