การส่งผ่านส่วนหัวด้วยคำขอ axios POST


135

ฉันได้เขียนคำขอ axios POST ตามที่แนะนำจากเอกสารประกอบแพ็คเกจ npm เช่น:

var data = {
    'key1': 'val1',
    'key2': 'val2'
}
axios.post(Helper.getUserAPI(), data)       
.then((response) => {
    dispatch({type: FOUND_USER, data: response.data[0]})
})
.catch((error) => {
    dispatch({type: ERROR_FINDING_USER})
})

และใช้งานได้ แต่ตอนนี้ฉันได้แก้ไข API แบ็กเอนด์เพื่อยอมรับส่วนหัวแล้ว

ประเภทเนื้อหา: 'application / json'

การอนุญาต: 'JWT fefege ... '

ตอนนี้คำขอนี้ใช้งานได้ดีกับบุรุษไปรษณีย์ แต่เมื่อเขียนการโทร axios ฉันไปตามลิงค์นี้และไม่สามารถใช้งานได้

ฉันได้รับ400 BAD Requestข้อผิดพลาดอยู่ตลอดเวลา

นี่คือคำขอแก้ไขของฉัน:

axios.post(Helper.getUserAPI(), {
    headers: {
        'Content-Type': 'application/json',
        'Authorization': 'JWT fefege...'
    },
    data
})      
.then((response) => {
    dispatch({type: FOUND_USER, data: response.data[0]})
})
.catch((error) => {
    dispatch({type: ERROR_FINDING_USER})
})

ความช่วยเหลือใด ๆ ที่ได้รับการชื่นชมอย่างมาก

คำตอบ:


243

เมื่อใช้ axios เพื่อส่งผ่านส่วนหัวที่กำหนดเองให้จัดหาอ็อบเจ็กต์ที่มีส่วนหัวเป็นอาร์กิวเมนต์สุดท้าย

แก้ไขคำขอ axios ของคุณเช่น:

const headers = {
  'Content-Type': 'application/json',
  'Authorization': 'JWT fefege...'
}

axios.post(Helper.getUserAPI(), data, {
    headers: headers
  })
  .then((response) => {
    dispatch({
      type: FOUND_USER,
      data: response.data[0]
    })
  })
  .catch((error) => {
    dispatch({
      type: ERROR_FINDING_USER
    })
  })

@KishoreJethava, 500 เป็นข้อผิดพลาดภายในเซิร์ฟเวอร์คุณสามารถตรวจสอบที่ฝั่งเซิร์ฟเวอร์ได้หรือไม่ว่าส่วนหัวมาหรือมีข้อผิดพลาดอื่น ๆ
Shubham Khatri

@KishoreJethava คุณสามารถบันทึกส่วนหัวในเซิร์ฟเวอร์ของคุณและดูว่าคุณได้รับค่าที่ถูกต้องหรือไม่
Shubham Khatri

คุณไม่จำเป็นต้องโพสต์ข้อมูลใด ๆ ? ตรวจสอบให้แน่ใจว่า this.state.token มีค่า
Shubham Khatri

ขอให้เรายังคงอภิปรายนี้ในการแชท
Kishore Jethava

@ShubhamKhatri ฉันขอให้คุณดูaxiosคำถามที่เกี่ยวข้องได้ที่นี่: stackoverflow.com/questions/59470085/… ?
Istiaque Ahmed

37

นี่คือตัวอย่างทั้งหมดของคำขอ axios.post ที่มีส่วนหัวแบบกำหนดเอง

var postData = {
  email: "test@test.com",
  password: "password"
};

let axiosConfig = {
  headers: {
      'Content-Type': 'application/json;charset=UTF-8',
      "Access-Control-Allow-Origin": "*",
  }
};

axios.post('http://<host>:<port>/<path>', postData, axiosConfig)
.then((res) => {
  console.log("RESPONSE RECEIVED: ", res);
})
.catch((err) => {
  console.log("AXIOS ERROR: ", err);
})


ประสบปัญหานี้เพื่อขอรับคำขอ การตอบกลับมาในรูปแบบ xml สิ่งนี้ไม่ได้ช่วยแก้ปัญหา
Eswar

3

สิ่งนี้อาจเป็นประโยชน์

const data = {
  email: "me@me.com",
  username: "me"
};

const options = {
  headers: {
      'Content-Type': 'application/json',
  }
};

axios.post('http://path', data, options)
 .then((res) => {
   console.log("RESPONSE ==== : ", res);
 })
 .catch((err) => {
   console.log("ERROR: ====", err);
 })
หมายเหตุ: รหัสสถานะทั้งหมดที่สูงกว่า 400 จะถูกจับใน Axios catch block นอกจากนี้ส่วนหัวยังเป็นทางเลือกสำหรับวิธีการโพสต์ใน Axios

blockquote

blockquote


2

คำตอบของ Shubham ไม่ได้ผลสำหรับฉัน

เมื่อคุณใช้ไลบรารี axios และเพื่อส่งผ่านส่วนหัวที่กำหนดเองคุณต้องสร้างส่วนหัวเป็นวัตถุที่มีชื่อคีย์ "ส่วนหัว" คีย์ส่วนหัวควรมีออบเจ็กต์ในที่นี้คือ Content-Type และ Authorization

ตัวอย่างด้านล่างทำงานได้ดี

    var headers = {
        'Content-Type': 'application/json',
        'Authorization': 'JWT fefege...' 
    }
    axios.post(Helper.getUserAPI(), data, {"headers" : headers})

        .then((response) => {
            dispatch({type: FOUND_USER, data: response.data[0]})
        })
        .catch((error) => {
            dispatch({type: ERROR_FINDING_USER})
        })

1

คุณยังสามารถใช้ตัวสกัดกั้นเพื่อส่งผ่านส่วนหัว

สามารถช่วยคุณประหยัดรหัสได้มาก

axios.interceptors.request.use(config => {
  if (config.method === 'POST' || config.method === 'PATCH' || config.method === 'PUT')
    config.headers['Content-Type'] = 'application/json;charset=utf-8';

  const accessToken = AuthService.getAccessToken();
  if (accessToken) config.headers.Authorization = 'Bearer ' + accessToken;

  return config;
});

ฉันอยากจะแนะนำให้ใช้config.method.toUpperCase()
Constantine

@Constantine ฉันคิดว่ามันเป็นตัวพิมพ์ใหญ่อยู่แล้ว
Israel kusayev

น่าเสียดายที่ของฉันต่ำกว่า
Constantine

0

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

storePropertyMaxSpeed(){
                axios.post('api/property', {
                    "property_name" : 'max_speed',
                    "property_amount" : this.newPropertyMaxSpeed
                    },
                    {headers :  {'Content-Type': 'application/json',
                                'Authorization': 'Bearer ' + this.$gate.token()}})
                  .then(() => { //this below peace of code isn't important 
                    Event.$emit('dbPropertyChanged');

                    $('#addPropertyMaxSpeedModal').modal('hide');

                    Swal.fire({
                        position: 'center',
                        type: 'success',
                        title: 'Nova brzina unešena u bazu',
                        showConfirmButton: false,
                        timer: 1500
                        })
                })
                .catch(() => {
                     Swal.fire("Neuspješno!", "Nešto je pošlo do đavola", "warning");
                })
            }
        },

-4

Json ต้องจัดรูปแบบด้วยเครื่องหมายคำพูดคู่

ชอบ:

headers: {
                "Content-Type": "application/Jason",
                "Authorization": "JWT fefege..."
            }

ไม่ใช่แค่:

headers: {
                'Content-Type': 'application/json',
                'Authorization': 'JWT fefege...'
         }

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