Запрос Forge Api PATCH возвращает 415 «неподдерживаемый тип носителя»

Я использую Forge API. Мне нужно выполнить запрос PATCH. Когда я отправляю его с помощью Postman, все в порядке, но когда я создаю запрос с помощью HttpRequestMessage, я получаю ответ - «415 неподдерживаемый тип носителя». В документации API Content-Type я установил «application/vnd.api+json».

Тело запроса в Postman

Запрос Forge Api PATCH возвращает 415 «неподдерживаемый тип носителя»Заголовки запроса в 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);
            }

Вместо установки HttpRequestHeader.Accept вы должны установить HttpRequestHeader.ContentType на application/vnd.api+json

Mohsin Mehmood 12.02.2019 22:33

Я установил ContentType в http.Content = new StringContent(...), потому что ContentType — это атрибут заголовков тела, а не запрос.

OlehP 13.02.2019 08:15

ContentType указывает тип данных, которые вы отправляете внутри тела запроса. Поэтому, если вы отправляете данные json внутри тела запроса, следует установить тип содержимого. На вашем скриншоте я заметил, что вы выбрали raw -> text, поэтому тип контента должен быть установлен на приложение / текст, если он работает в почтальоне.

Mohsin Mehmood 13.02.2019 08:48

Нет, в Postman я установил Content-Type на «application/vnd.api+json» (см. отредактированный вопрос выше)

OlehP 13.02.2019 09:18
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
2 315
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Попробуйте еще раз с "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");

OlehP 13.02.2019 08:17

Нет такой вещи, как body headers... вы все равно устанавливаете заголовки запроса... третий аргумент, передаваемый HttpContent (или точная реализация StringContent), устанавливает тип контента в заголовке вашего запроса на указанный тип носителя.. , см. здесь для хорошего объяснения.

Bryan Huang 13.02.2019 09:07

Возможно, я написал неправильно, но я имею в виду, что объект запроса не содержит «Content-Type» в заголовке, он находится в request.Content.Headers.Content-Type (см. отредактированный вопрос)

OlehP 13.02.2019 09:33

Наверняка объект запроса не имеет ничего общего с типом носителя или ошибкой, которую вы получаете. Оба моих подхода заключались в установке Content-Type заголовка запроса, а не объекта запроса... Когда вы создали StringContent, третий аргумент также устанавливает поле Content-Type в request header, а не полезную нагрузку/тело запроса или объект запроса.

Bryan Huang 13.02.2019 09:44

Этот подход HttpContent может сбивать с толку, поскольку вы, по-видимому, работаете исключительно с полезной нагрузкой содержимого/тела, а не с заголовками запроса, но с этим третьим аргументом вы действительно устанавливаете заголовок запроса и, следовательно, мой второй подход для подавления внутренней проверки HttpContent(superclass из StringContent) и, в свою очередь, HttpHeaders, который мог бы отклонить application/vnd.api+json как допустимый тип носителя...

Bryan Huang 13.02.2019 09:46

Спасибо за ваши ответы, это помогло мне понять, в чем проблема.

OlehP 13.02.2019 10:09

Хорошо, я решил проблему, установив 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?

Mohsin Mehmood 13.02.2019 11:27

Content-Type — это заголовок, который необходимо добавить в http.Content.Headers, а не в HttpRequestMessage.Headers.

OlehP 13.02.2019 11:53

HttpRequestMessage представляет собой запрос, который содержит его URL-адрес, тело и заголовки. Итак, в вашем коде Headers = { { HttpRequestHeader.Authorization.ToString(), "Bearer " + userLastAccessToken }, { HttpRequestHeader.ContentType.ToString(), "application/vnd.api+json" } }, если вы установите заголовок ContentType, он также будет работать.

Mohsin Mehmood 13.02.2019 11:56

Это не работает, Content-Type должен быть установлен в http.Content.Headers.ContentType. Я пробовал все варианты, и только вышеперечисленное работает.

OlehP 13.02.2019 12:10

Другие вопросы по теме