“ 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*******"
}

คำตอบ:


263

การดำเนินการของคุณไม่ล้มเหลว

บริการแบ็คเอนด์ของคุณกำลังบอกว่าประเภทการตอบกลับที่ส่งคืนไม่ได้ระบุไว้ในส่วนหัวยอมรับ HTTP ในคำขอไคลเอ็นต์ของคุณ

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

  1. ค้นหาคำตอบ (ประเภทเนื้อหา) ที่บริการส่งคืน
  2. ระบุสิ่งนี้ (ประเภทเนื้อหา) ในคำขอของคุณยอมรับส่วนหัว

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


6
สวัสดีเมื่อคุณพูดว่า "ค้นหาคำตอบ (ประเภทเนื้อหา) ที่บริการส่งคืน" ฉันจะตรวจสอบสิ่งนี้ได้อย่างไร ฉันกำลังส่งคืน json จากไฟล์ php ดังนั้นฉันจึงสันนิษฐานว่าประเภทเนื้อหาจะเป็น json (หรือฉันจำเป็นต้องระบุในส่วนหัวของไฟล์ php หรือไม่) และฉันได้ให้ประเภทเนื้อหานี้ไว้ในส่วนหัวคำขอเช่น 'ยอมรับ': 'แอพลิเคชัน / JSON' สิ่งนี้จะถูกต้องหรือไม่ ขอบคุณ
Sarah

41

406 ไม่สามารถยอมรับได้ทรัพยากรที่ระบุโดยการร้องขอนั้นสามารถสร้างเอนทิตีการตอบสนองที่มีลักษณะเนื้อหาที่ไม่สามารถยอมรับได้ตามส่วนหัวยอมรับที่ส่งมาในคำขอ

406 เกิดขึ้นเมื่อเซิร์ฟเวอร์ไม่สามารถตอบสนองกับ accept-header ที่ระบุในคำขอ ในกรณีของคุณดูเหมือนว่า application / json สำหรับการตอบสนองอาจไม่เป็นที่ยอมรับของเซิร์ฟเวอร์


7
คุณไม่มีการลบส่วนหัวคุณจะต้องให้คนอื่นซึ่งเป็นที่ยอมรับไปยังเซิร์ฟเวอร์ en.wikipedia.org/wiki/…
ashutosh raina

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

และมันจะแก้ปัญหาของคุณ มันใช้งานได้สำหรับฉัน :)


2

นอกจากนี้คุณยังสามารถรับการตอบสนอง 406 เมื่อคุกกี้ที่ไม่ถูกต้องจัดเก็บหรืออ้างอิงในเบราว์เซอร์ - ตัวอย่างเช่นเมื่อใช้เซิร์ฟเวอร์ Rails ในโหมด Dev ภายในเครื่อง

หากคุณเกิดขึ้นกับรันสองโปรเจ็กต์ที่ต่างกันบนพอร์ตเดียวกันเบราว์เซอร์อาจอ้างอิงคุกกี้จากเซสชันโลคัลโฮสต์อื่น

เรื่องนี้เกิดขึ้นกับฉัน ... สะดุดฉันเป็นเวลาหนึ่งนาที ดูในเบราว์เซอร์> โหมดนักพัฒนา> เครือข่ายแสดงให้เห็น


2

"บางครั้ง" นี่อาจหมายความว่าเซิร์ฟเวอร์มีข้อผิดพลาดภายในและต้องการตอบกลับด้วยข้อความแสดงข้อผิดพลาด (เช่น: 500 พร้อมเพย์โหลด JSON) แต่เนื่องจากส่วนหัวคำขอไม่ได้พูดว่ายอมรับ JSON จึงส่งคืน 406 แทน ไปคิด (ในกรณีนี้คือ webapp สำหรับการบูตในฤดูใบไม้ผลิ)

ในกรณีนี้การดำเนินการของคุณล้มเหลว แต่ข้อความความล้มเหลวถูกบดบังโดยผู้อื่น


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

0

หากคุณใช้ 'request.js' คุณอาจใช้สิ่งต่อไปนี้:

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

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

0

ในกรณีของฉันสำหรับ API ใน. NET-Core, api ถูกตั้งค่าให้ทำงานกับ XML (โดยค่าเริ่มต้นถูกตั้งค่าให้ตอบสนองกับ JSON) ดังนั้นฉันจึงเพิ่มคำอธิบายประกอบนี้ใน Controller ของฉัน:

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

ขอบคุณสำหรับการวางฉันบนเส้นทาง!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.