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 phpRestAPI
json 입력을 대기하기 때문에FormUrlEncodedContent
를 송신할 필요가 있습니다.raw
json은 정확합니다.근데 어떻게 해야 돼?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
에서 유래합니다.HttpContent
Microsoft 의 문서를 참조해 주세요.
이 클래스에는 다음과 같은 정적 메서드가 포함되어 있습니다.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 Client
NuGet에서.
하여 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
'programing' 카테고리의 다른 글
JSON의 단일 따옴표와 이중 따옴표 (0) | 2023.04.03 |
---|---|
polylang을 통해 페이지 언어 가져오기 및 동일한 언어 페이지로 리디렉션 (0) | 2023.04.03 |
GSON을 사용하여 JSON 파일을 해석하는 방법 (0) | 2023.04.03 |
PHP 스크립트/WP REST API에 대한 동시 AJAX 요청이 왜 이렇게 느리죠? (0) | 2023.04.03 |
배열에 값이 있는지 확인합니다(각도).JS) (0) | 2023.04.03 |