programing

HttpClient에 개체를 전달하려면 어떻게 해야 합니까?PostAsync와 JSON 바디로 시리얼화하시겠습니까?

powerit 2023. 4. 3. 21:49
반응형

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? my phpRestAPIjson 입력을 대기하기 때문에FormUrlEncodedContent를 송신할 필요가 있습니다.rawjson은 정확합니다.근데 어떻게 해야 돼?Microsoft.Net.Http감사합니다.

당신의 질문에 대한 솔직한 대답은 "아니오"입니다.메서드의 시그니처는 다음과 같습니다.

퍼블릭 태스크 PostAsync(Uri requestUri, HttpContent 콘텐츠)

그래서, 네가 그 일을 할 수 있을 때object로.PostAsync종류여야 한다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);

새로운 .NET 5+ 솔루션:

.NET 5에서는 새로운 클래스가 도입되었습니다.JsonContent에서 유래합니다.HttpContentMicrosoft문서를 참조해 주세요.

이 클래스에는 다음과 같은 정적 메서드가 포함되어 있습니다.Create()임의의 오브젝트를 파라미터로 하여 이름에서 알 수 있듯이의 인스턴스를 반환합니다.JsonContent이 명령어를 인수로 전달할 수 있습니다.PostAsync방법.

사용방법:

var myObject = new
{
    foo = "Hello",
    bar = "World",
};

JsonContent content = JsonContent.Create(myObject);

await _httpClient.PostAsync("https://...", content);

좋은 것은, 실제로 새로운 을 사용할 수 있다는 것입니다.PostAsJsonAsync보다 간결하게 하기 위한 확장 메서드입니다.자세한 것은, 문서를 참조해 주세요.사용방법:

var myObject = new
{
    foo = "Hello",
    bar = "World",
};
await _httpClient.PostAsJsonAsync("https://...", myObject);

은 단단 a a a를 사용하는 입니다.Microsoft ASP.NET Web API 2.2 ClientNuGet에서.

하여 JSON을 할 수 있습니다Content-Type header header header header header header 。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.Client 패키지.도 있고 NuGet 패키지 또는 NuGet 패키지(NuGet 패키지)를 통해 설치할 수도 있습니다.Microsoft.AspNetCore.App.

「」를 사용합니다.HttpClient.PostAsync와 「」를 수 .JsonMediaTypeFormatter이치노

응답에서는, 「」를 사용할 수 .HttpContent.ReadAsAsync<T>응답 내용을 예상되는 유형으로 역직렬화하려면 다음 절차를 수행합니다.

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

@arad 좋은 점.실제로 이 확장 메서드(.NET 5.0):

PostAsJsonAsync<TValue>(HttpClient, String, TValue, CancellationToken)

https://learn.microsoft.com/en-us/dotnet/api/system.net.http.json.httpclientjsonextensions.postasjsonasync?view=net-5.0 에서

이제 다음을 수행할 수 있습니다.

var data = new { foo = "Hello"; bar = 42; };
var response = await _Client.PostAsJsonAsync(_Uri, data, cancellationToken);

두 하면 .JsonContent.Create(yourObject);는, 을 참조해 주세요./5

또는 오브젝트 상에서 작성 및 확장 메서드를 호출합니다.

public static StringContent GetStringContent(this object obj)
{
    var jsonContent = JsonConvert.SerializeObject(obj);
    var contentString = new StringContent(jsonContent, Encoding.UTF8, "application/json");
    contentString.Headers.ContentType = new MediaTypeHeaderValue("application/json");

    return contentString;
}
public static async Task<string> Post(string param, string code, string subject, string description)
    {
        object mydata = new
        {
            code = code,
            subject = subject,
            description = description
        };
        var myContent = JsonConvert.SerializeObject(mydata);
        var buffer = System.Text.Encoding.UTF8.GetBytes(myContent);
        var byteContent = new ByteArrayContent(buffer);
        byteContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");

        using (HttpClient client = new HttpClient())
        {
            using (HttpResponseMessage res = await client.PostAsync(baseURL + param, byteContent))
            {
                Console.WriteLine("Nico", res);
                using (HttpContent content = res.Content)
                {
                    string data = await content.ReadAsStringAsync();
                    if (data != null) { return data; }
                }
            }
        }
        return string.Empty;
    }

나의 다른 형태로

private async void button2_Click(object sender, EventArgs e) //POST
        {
            string param = "subject";
            string code = txtCode.Text; //NC101
            string subject = txtSubject.Text;
            string description = txtDescription.Text;
            var res = await RESTHelper.Post(param, code, subject, description);
            txtRes.Text = res;
        }

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

반응형