Что такое «406-неприемлемый ответ» в HTTP?

185

В своем приложении Ruby on Rails я пытался загрузить изображение через клиент POSTMAN REST в формате Base64 . Когда я размещаю изображение, я получаю 406 неприемлемый ответ . Когда я проверил свою базу данных, изображение было там и было успешно сохранено.

В чем причина этой ошибки, есть ли что-то, что мне нужно указать в моем заголовке?

Мой запрос:

URL --- http://localhost:3000/exercises.json

Заголовок:

Content-Type  -  application/json

Необработанные данные:

{
    "exercise": {
        "subbodypart_ids": [
            "1",
            "2"
        ],
        "name": "Exercise14"
    },
    "image_file_name": "Pressurebar Above.jpg",
    "image":"******base64 Format*******"
}
Cyber
источник
1
media.licdn.com/media-proxy/…
Кислород

Ответы:

263

Ваша операция не провалилась.

Ваш бэкэнд-сервис сообщает, что тип ответа, который он возвращает, не указан в заголовке Accept HTTP в вашем клиентском запросе.

Ссылка: http://en.wikipedia.org/wiki/List_of_HTTP_header_fields

  1. Узнайте ответ (тип контента), возвращаемый службой.
  2. Укажите это (тип контента) в заголовке запроса Accept.

http://en.wikipedia.org/wiki/HTTP_status_code -> 406

TheWhiteRabbit
источник
6
Привет, Когда вы говорите: «Узнайте ответ (тип контента), возвращаемый службой»? Как я могу это проверить? Я возвращаю json из php-файла, поэтому я предполагаю, что тип содержимого будет json (или мне нужно указать это в заголовках php-файла?), Также я предоставил этот тип содержимого в заголовке моего запроса, например, «Accept»: "приложения / JSON. это будет правильно? спасибо
Сара
41

406 Недопустимо Ресурс, идентифицированный запросом, способен генерировать только объекты ответа, которые имеют характеристики контента, неприемлемые в соответствии с заголовками принятия, отправленными в запросе.

406 происходит, когда сервер не может ответить заголовком accept, указанным в запросе. В вашем случае кажется, что application / json для ответа может быть неприемлемым для сервера.

Ашутош Райна
источник
7
Вы не должны удалять заголовок, вам нужно будет указать другой, приемлемый для сервера. en.wikipedia.org/wiki/...
Ашутош Райна
7

Вы упомянули, что вы используете Ruby on Rails в качестве бэкэнда. Вы не опубликовали код для соответствующего метода, но я предполагаю, что он выглядит примерно так:

def create
  post = Post.create params[:post]
  respond_to do |format|
    format.json { render :json => post }
  end
end

Измените это на:

def create
  post = Post.create params[:post])
  render :json => post
end

И это решит вашу проблему. У меня это сработало :)

itamaryu
источник
2

Вы также можете получить ответ 406, когда недопустимые файлы cookie сохраняются или на них ссылаются в браузере - например, при локальном запуске сервера Rails в режиме Dev.

Если вам довелось запустить два разных проекта на одном и том же порту, браузер может ссылаться на файл cookie из другого сеанса localhost.

Это случилось со мной ... сбило меня с толку на минуту. Посмотрев в браузере> Режим разработчика> Сеть это показала.

etusm
источник
2

«Иногда» это может означать, что на сервере произошла внутренняя ошибка, и он хотел ответить сообщением об ошибке (например, 500 с полезной нагрузкой JSON), но поскольку заголовки запроса не сказали, что он принял JSON, вместо этого он возвращает 406. Пойди разберись. (в данном случае: весеннее загрузочное веб-приложение).

В этом случае ваша операция не удалась. Но сообщение об ошибке было скрыто другим.

rogerdpack
источник
1

В моем случае я добавил:

Content-Type: application/x-www-form-urlencoded

решил мою проблему полностью.

Кадир Эртюрк
источник
1
const request = require('request');

const headers = {
    'Accept': '*/*',
    'User-Agent': 'request',
};

const options = {
    url: "https://example.com/users/6",
    headers:  headers
};

request.get(options, (error, response, body) => {
    console.log(response.body);
});
JP Ventura
источник
0

Если вы используете request.js, вы можете использовать следующее:

var options = {
  url: 'localhost',
  method: 'GET',
  headers:{
    Accept: '*/*'
  }
}

request(options, function (error, response, body) {
  ...
})
Альфредо Моралес Пинсон
источник
0

В моем случае для API в .NET-Core API настроен на работу с XML (по умолчанию настроен на ответ с JSON), поэтому я добавляю эту аннотацию в мой контроллер:

[Produces("application/xml")]
public class MyController : ControllerBase {...}

Спасибо, что поставили меня на путь!

Франсуа Борджи
источник