Я использую Forge API. Мне нужно выполнить запрос PATCH. Когда я отправляю его с помощью Postman, все в порядке, но когда я создаю запрос с помощью HttpRequestMessage, я получаю ответ - «415 неподдерживаемый тип носителя». В документации API Content-Type я установил «application/vnd.api+json».
Тело запроса в Postman
JObject jsonApi = new JObject();
jsonApi.Add("version", "1.0");
JObject attributes = new JObject();
attributes.Add("displayName", file.FileName);
JObject data = new JObject();
data.Add("type", "items");
data.Add("id", file.ExternalFileId);
data.Add("attributes", attributes);
JObject request = new JObject();
request.Add("jsonapi", jsonApi);
request.Add("data", data);
using (var httpClient = new HttpClient())
{
HttpRequestMessage http = new HttpRequestMessage
{
RequestUri = new Uri(url),
Method = new HttpMethod("PATCH"),
Headers =
{
{ HttpRequestHeader.Authorization.ToString(), "Bearer " + userLastAccessToken },
{ HttpRequestHeader.Accept.ToString(), "application/vnd.api+json" }
}
};
http.Content = new StringContent(request.ToString(), Encoding.UTF8, "application/vnd.api+json");
HttpResponseMessage responseMessage = await httpClient.SendAsync(http);
}
Я установил ContentType в http.Content = new StringContent(...), потому что ContentType — это атрибут заголовков тела, а не запрос.
ContentType указывает тип данных, которые вы отправляете внутри тела запроса. Поэтому, если вы отправляете данные json внутри тела запроса, следует установить тип содержимого. На вашем скриншоте я заметил, что вы выбрали raw -> text, поэтому тип контента должен быть установлен на приложение / текст, если он работает в почтальоне.
Нет, в Postman я установил Content-Type на «application/vnd.api+json» (см. отредактированный вопрос выше)





Попробуйте еще раз с "application/json" или используйте HttpHeaders.TryAddWithoutValidation ("application/vnd.api+json" может не подойти для внутренней проверки HttpHeaders):
http.Content = new StringContent(request.ToString(), Encoding.UTF8, "application/json");
Или:
http.Content = new StringContent(request.ToString(), Encoding.UTF8);
http.Headers.TryAddWithoutValidation("Content-Type", "application/vnd.api+json");
Я не могу использовать «application/json», потому что API forge строго говорит, что это должно быть «application/vnd.api+json». Второй подход некорректен, так как ContentType является атрибутом заголовков тела, а не запроса http.Headers.TryAddWithoutValidation("Content-Type", "application/vnd.api+json");
Нет такой вещи, как body headers... вы все равно устанавливаете заголовки запроса... третий аргумент, передаваемый HttpContent (или точная реализация StringContent), устанавливает тип контента в заголовке вашего запроса на указанный тип носителя.. , см. здесь для хорошего объяснения.
Возможно, я написал неправильно, но я имею в виду, что объект запроса не содержит «Content-Type» в заголовке, он находится в request.Content.Headers.Content-Type (см. отредактированный вопрос)
Наверняка объект запроса не имеет ничего общего с типом носителя или ошибкой, которую вы получаете. Оба моих подхода заключались в установке Content-Type заголовка запроса, а не объекта запроса... Когда вы создали StringContent, третий аргумент также устанавливает поле Content-Type в request header, а не полезную нагрузку/тело запроса или объект запроса.
Этот подход HttpContent может сбивать с толку, поскольку вы, по-видимому, работаете исключительно с полезной нагрузкой содержимого/тела, а не с заголовками запроса, но с этим третьим аргументом вы действительно устанавливаете заголовок запроса и, следовательно, мой второй подход для подавления внутренней проверки HttpContent(superclass из StringContent) и, в свою очередь, HttpHeaders, который мог бы отклонить application/vnd.api+json как допустимый тип носителя...
Спасибо за ваши ответы, это помогло мне понять, в чем проблема.
Хорошо, я решил проблему, установив ContentType таким образом
http.Content = new StringContent(request.ToString(), Encoding.UTF8);
http.Content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/vnd.api+json");
Чем это отличается от установки HttpRequestHeader.ContentType на application/vnd.api+json?
Content-Type — это заголовок, который необходимо добавить в http.Content.Headers, а не в HttpRequestMessage.Headers.
HttpRequestMessage представляет собой запрос, который содержит его URL-адрес, тело и заголовки. Итак, в вашем коде Headers = { { HttpRequestHeader.Authorization.ToString(), "Bearer " + userLastAccessToken }, { HttpRequestHeader.ContentType.ToString(), "application/vnd.api+json" } }, если вы установите заголовок ContentType, он также будет работать.
Это не работает, Content-Type должен быть установлен в http.Content.Headers.ContentType. Я пробовал все варианты, и только вышеперечисленное работает.
Вместо установки
HttpRequestHeader.Acceptвы должны установитьHttpRequestHeader.ContentTypeнаapplication/vnd.api+json