Пользуюсь 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, поэтому он FormUrlEncodedContent
должен raw
правильно отправлять json. Но как я могу это сделать Microsoft.Net.Http
? Спасибо.
c#
json
dotnet-httpclient
IlDrugo
источник
источник
using
дляHttpClient
. aspnetmonsters.com/2016/08/2016-08-27-httpclientwrongusing
не следует использовать:HttpClient is intended to be instantiated once and reused throughout the life of an application. The following conditions can result in SocketException errors: Creating a new HttpClient instance per request. Server under heavy load. Creating a new HttpClient instance per request can exhaust the available sockets.
docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/…Ответы:
Прямой ответ на ваш вопрос: Нет. Подпись
PostAsync
метода следующая:Таким образом, в то время как вы можете пройти
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
свойства, как здесь, может иметь плохие побочные эффекты, например мертвую блокировку, поэтому будьте осторожны с этим.источник
POST, PUT, DELETE
выполняется, обычно возвращается APITRUE
, я объявил метод какstring
, но когда я это сделаю:return result;
я получаю:,Can't Convert HttpResponseMessage in string
следует ли мне изменить объявление метода? Мне нужен строковый ответ, потому что мне нужно будет десериализовать его после в другом методе класса.result.Content.ReadAsStringAsync()
), вероятно, вполне подойдет. В зависимости от структуры вашего приложения, может быть лучше вернутьContent
объект напрямую, если вам нужно проверить заголовки, чтобы определить тип содержимого (например, XML или JSON). Но если вы знаете, что он всегда будет возвращать JSON (или какой-либо другой формат), тогда просто вернуть тело ответа в виде строки должно быть нормально.StringContent
?StringContent
напрямую,PostAsync
поскольку он происходит отHttpContent
.Вам нужно передать свои данные в теле запроса в виде необработанной строки, а не
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);
источник
stringContent
? В моем случаеstringContent
значение равно"\"\""
. Это правильное значение?Простое решение состоит в использовании
Microsoft ASP.NET Web API 2.2 Client
от NuGet .Затем вы можете просто сделать это, и он сериализует объект в 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.Client
пакет NuGet, который можно установить напрямую или через другой, напримерMicrosoft.AspNetCore.App
.Используя эту подпись
HttpClient.PostAsync
, вы можете передать любой объект, иJsonMediaTypeFormatter
он автоматически позаботится о сериализации и т. Д.С ответом вы можете использовать его
HttpContent.ReadAsAsync<T>
для десериализации содержимого ответа до ожидаемого типа:var responseObject = await response.Content.ReadAsAsync<MyResponseType>();
источник
.NET Standard
или.NET Core
, как я уже упоминал. Может ты пользуешься.NET Framework
? В моем проекте JsonMediaTypeFormatter загружается отсюда: C: \ Program Files \ dotnet \ sdk \ NuGetFallbackFolder \ microsoft.aspnet.webapi.client \ 5.2.6 \ lib \ netstandard2.0 \ System.Net.Http.Formatting. dll