Hồi giáo 406-Không thể chấp nhận Phản hồi trong HTTP là gì?


185

Trong ứng dụng Ruby on Rails của tôi, tôi đã cố gắng tải lên một hình ảnh thông qua ứng dụng khách POSTMAN REST ở định dạng Base64 . Khi tôi gửi hình ảnh, tôi nhận được phản hồi 406 không chấp nhận được . Khi tôi kiểm tra cơ sở dữ liệu của mình, hình ảnh đã ở đó và được lưu thành công.

Lý do cho lỗi này là gì, có điều gì tôi cần chỉ định trong tiêu đề của mình không?

Yêu cầu của tôi:

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

Tiêu đề:

Content-Type  -  application/json

Dữ liệu thô:

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

Câu trả lời:


263

Hoạt động của bạn đã không thất bại.

Dịch vụ phụ trợ của bạn nói rằng loại phản hồi mà nó trả về không được cung cấp trong tiêu đề Chấp nhận HTTP trong yêu cầu Máy khách của bạn.

Tham chiếu: http://en.wikipedia.org/wiki/List_of_HTTP_header_fields

  1. Tìm hiểu phản hồi (loại nội dung) được trả về bởi Dịch vụ.
  2. Cung cấp điều này (loại nội dung) trong tiêu đề Chấp nhận yêu cầu của bạn.

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


5
Xin chào, Khi bạn nói "Tìm hiểu phản hồi (loại nội dung) được dịch vụ trả về"? Làm thế nào tôi có thể kiểm tra điều này? Tôi đang trả lại json từ một tệp php vì vậy tôi cho rằng loại nội dung sẽ là json (hoặc tôi có cần chỉ định phần này trong các tiêu đề của tệp php không?) Tôi cũng đã cung cấp loại nội dung này trong tiêu đề yêu cầu của mình như vậy 'Chấp nhận': 'ứng dụng / json'. Điều này có đúng không? cảm ơn
Sarah

41

406 Không được chấp nhận Tài nguyên được xác định bởi yêu cầu chỉ có khả năng tạo các thực thể phản hồi có các đặc điểm nội dung không được chấp nhận theo các tiêu đề chấp nhận được gửi trong yêu cầu.

406 xảy ra khi máy chủ không thể phản hồi với tiêu đề chấp nhận được chỉ định trong yêu cầu. Trong trường hợp của bạn, có vẻ như ứng dụng / json cho phản hồi có thể không được chấp nhận đối với máy chủ.


7
Bạn không xóa tiêu đề, bạn sẽ phải cung cấp một tiêu đề khác được máy chủ chấp nhận. vi.wikipedia.org/wiki/ từ
ashutosh raina

7

Bạn đã đề cập đến việc bạn đang sử dụng Ruby on Rails như một phụ trợ. Bạn đã không đăng mã cho phương thức liên quan, nhưng tôi đoán là nó trông giống như thế này:

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

Thay đổi nó thành:

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

Và nó sẽ giải quyết vấn đề của bạn. Nó làm việc cho tôi :)


2

Bạn cũng có thể nhận được phản hồi 406 khi cookie không hợp lệ được lưu trữ hoặc được tham chiếu trong trình duyệt - ví dụ: khi chạy máy chủ Rails ở chế độ Dev cục bộ.

Nếu bạn tình cờ chạy hai dự án khác nhau trên cùng một cổng, trình duyệt có thể tham chiếu cookie từ một phiên localhost khác.

Điều này đã xảy ra với tôi ... làm tôi vấp ngã trong một phút. Nhìn trong trình duyệt> Chế độ nhà phát triển> Mạng đã hiển thị nó.


2

"Đôi khi" điều này có thể có nghĩa là máy chủ có lỗi nội bộ và muốn phản hồi với thông báo lỗi (ví dụ: 500 với tải trọng JSON) nhưng vì các tiêu đề yêu cầu không cho biết đã chấp nhận JSON, thay vào đó, nó trả về 406. Đi hình. (trong trường hợp này: webapp khởi động mùa xuân).

Trong trường hợp đó, hoạt động của bạn đã thất bại. Nhưng tin nhắn thất bại đã bị che khuất bởi một người khác.


1

Trong trường hợp của tôi, tôi đã thêm:

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

giải quyết hoàn toàn vấn đề của tôi


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);
});

0

Nếu bạn đang sử dụng 'request.js', bạn có thể sử dụng như sau:

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

request(options, function (error, response, body) {
  ...
})

0

Trong trường hợp của tôi đối với API trong .NET-Core, api được thiết lập để hoạt động với XML (theo mặc định được đặt thành phản hồi với JSON), vì vậy tôi thêm chú thích này vào Trình điều khiển của mình:

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

Cảm ơn bạn đã đưa tôi vào con đường!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.