StringContent против ObjectContent

Я использую систему.Сеть.HttpClient Http для вызова REST API с помощью " POST" используя следующий код:

using (HttpRequestMessage requestMessage = new HttpRequestMessage(
                                           HttpMethod.Post, new Uri(request)) { })
{
     response = await httpClient.PostAsync(request, objectContent);
}

"objectContent" в настоящее время это -

objectContent = new ObjectContent(jsonContent.GetType(),
                                  jsonContent,
                                  new JsonMediaTypeFormatter());

мне было интересно, какая разница, если это был StringContent, а не ObjectContent, как это?

objectContent = new StringContent(content);
objectContent.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json");

оба работают нормально. Поскольку это JSON, я склонен предполагать, что StringContent будет иметь смысл. Но когда ObjectContent будет использоваться, потому что почти все содержимое послал-это "строка".

3 ответов


мне было интересно, какая разница, если это был StringContent а не ObjectContent такой?

в вашем примере не будет никакой разницы. ObjectContent просто позволяет" более широкий " диапазон типов для отправки через HttpClient, а StringContent меньше на string только значения, такие как JSON.

StringContent - Это тонкая обертка вокруг ByteArrayContent, и фактически сохраняет значение передается как byte[]. Вы просто получаете преимущество не необходимо преобразовать ваш string и обратно.

Edit:

учитывая тот факт, что вы публикуете JSON, вы даже можете сделать его менее подробным, используя HttpClientExtensions.PostAsJsonAsync<T>:

await httpClient.PostAsJsonAsync(url, json);

Если кто-то будет искать, как отправить запрос PostAsync в .NET Core 2.1: Я не нашел метод PostAsJsonAsync в HttpClient, но ваше решение с настройкой:

objectContent = new StringContent(content);
objectContent.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json");

" сделать работу " отлично также в .NET Core.

Edit:

кроме того, если вы хотите добавить свой собственный заголовок, вы можете ввести:

objectContent.Headers.Add("Your header", "Value");

ObjectContent используется для форматирования более сложных типов Mime с помощью встроенных или пользовательских форматеров. Можно также использовать ObjectContent для простой строки, это не имеет большого значения, за исключением производительности, которая (IMHO и не проверена) может быть лучше с StringContent, так как она может быть оптимизирована специально для строк