Apa itu "406-Not Acceptable Response" dalam HTTP?

185

Dalam aplikasi Ruby on Rails saya, saya mencoba mengunggah gambar melalui klien POSTMAN REST dalam format Base64 . Ketika saya POST gambar saya mendapatkan 406 Tidak Respons Diterima . Ketika saya memeriksa database saya, gambar itu ada di sana dan berhasil disimpan.

Apa alasan untuk kesalahan ini, adakah yang perlu saya tentukan di header saya?

Permintaanku:

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

Tajuk:

Content-Type  -  application/json

Data mentah:

{
    "exercise": {
        "subbodypart_ids": [
            "1",
            "2"
        ],
        "name": "Exercise14"
    },
    "image_file_name": "Pressurebar Above.jpg",
    "image":"******base64 Format*******"
}
Cyber
sumber

Jawaban:

263

Operasi Anda tidak gagal.

Layanan backend Anda mengatakan bahwa jenis respons yang dikembalikan tidak disediakan di header Terima HTTP dalam permintaan Klien Anda.

Ref: http://en.wikipedia.org/wiki/List_of_HTTP_header_fields

  1. Cari tahu respons (tipe konten) yang dikembalikan oleh Layanan.
  2. Berikan ini (tipe konten) di header Terima permintaan Anda.

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

TheWhiteRabbit
sumber
6
Hai, Ketika Anda mengatakan "Cari tahu respons (tipe konten) yang dikembalikan oleh layanan"? Bagaimana saya memeriksanya? Saya mengembalikan json dari file php sehingga saya menganggap jenis kontennya adalah json (atau apakah saya perlu menentukan ini di header file php?) Juga saya memberikan tipe konten ini di header permintaan saya seperti 'Terima': 'aplikasi / json'. apakah ini benar? terima kasih
Sarah
41

406 Tidak Dapat Diterima Sumber daya yang diidentifikasi oleh permintaan hanya mampu menghasilkan entitas respons yang memiliki karakteristik konten yang tidak dapat diterima menurut header penerimaan yang dikirim dalam permintaan.

406 terjadi ketika server tidak dapat merespons dengan header terima yang ditentukan dalam permintaan. Dalam kasus Anda tampaknya aplikasi / json untuk respons mungkin tidak dapat diterima oleh server.

ashutosh raina
sumber
7
Anda tidak harus menghapus header, Anda harus menyediakan yang berbeda yang dapat diterima oleh server. en.wikipedia.org/wiki/…
ashutosh raina
7

Anda menyebutkan bahwa Anda menggunakan Ruby on Rails sebagai backend. Anda tidak mengeposkan kode untuk metode yang relevan, tetapi tebakan saya terlihat seperti ini:

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

Ubah ke:

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

Dan itu akan menyelesaikan masalah Anda. Ini bekerja untuk saya :)

itamaryu
sumber
2

Anda juga dapat menerima respons 406 ketika cookie yang tidak valid disimpan atau direferensikan di browser - misalnya, ketika menjalankan server Rails dalam mode Dev secara lokal.

Jika Anda menjalankan dua proyek berbeda pada port yang sama, browser mungkin merujuk cookie dari sesi localhost yang berbeda.

Ini terjadi pada saya ... membuat saya tersandung sebentar. Mencari di browser> Mode Pengembang> Jaringan menunjukkannya.

etusm
sumber
2

"Kadang-kadang" ini dapat berarti bahwa server memiliki kesalahan internal, dan ingin merespons dengan pesan kesalahan (mis: 500 dengan muatan JSON) tetapi karena header permintaan tidak mengatakan itu menerima JSON, ia malah mengembalikan 406. Sosok pergi. (dalam hal ini: spring boot webapp).

Dalam hal ini, operasi Anda gagal. Tetapi pesan kegagalan itu dikaburkan oleh orang lain.

rogerdpack
sumber
1

Dalam kasus saya, saya menambahkan:

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

menyelesaikan masalah saya sepenuhnya.

Kadir Erturk
sumber
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
sumber
0

Jika Anda menggunakan 'request.js', Anda dapat menggunakan yang berikut:

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

request(options, function (error, response, body) {
  ...
})
Alfredo Morales Pinzón
sumber
0

Dalam kasus saya untuk API di .NET-Core, api diatur untuk bekerja dengan XML (secara default diatur ke respons dengan JSON), jadi saya menambahkan anotasi ini di Controller saya:

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

Terima kasih telah menempatkan saya di jalan!

Francois Borgies
sumber