Axios ลบคำขอที่มีเนื้อหาและส่วนหัวหรือไม่


119

ฉันใช้ Axios ขณะเขียนโปรแกรมใน ReactJS และฉันแสร้งทำเป็นส่งคำขอ DELETE ไปยังเซิร์ฟเวอร์ของฉัน

ในการทำเช่นนั้นฉันต้องการส่วนหัว:

headers: {
  'Authorization': ...
}

และร่างกายประกอบด้วย

var payload = {
    "username": ..
}

ฉันค้นหาในเว็บระหว่างกันและพบเพียงว่าเมธอด DELETE ต้องการ "พารามิเตอร์" และไม่ยอมรับ "ข้อมูล"

ฉันพยายามส่งแบบนี้:

axios.delete(URL, payload, header);

หรือแม้กระทั่ง

axios.delete(URL, {params: payload}, header);

แต่ดูเหมือนจะไม่ได้ผล ...

ใครช่วยบอกหน่อยได้ไหมว่าเป็นไปได้ (ฉันคิดว่าเป็น) เพื่อส่งคำขอ DELETE พร้อมทั้งส่วนหัวและเนื้อหาและต้องทำอย่างไร

ขอบคุณล่วงหน้า!

คำตอบ:


145

หลังจากลองหลายครั้งฉันพบว่ามันใช้ได้ผล

โปรดทำตามลำดับคำสั่งซึ่งสำคัญมากมิฉะนั้นจะไม่ทำงาน

axios.delete(URL, {
  headers: {
    Authorization: authorizationToken
  },
  data: {
    source: source
  }
});

2
สวัสดีคุณช่วยอธิบายได้ไหมว่าทำไมคำตอบของคุณถึงได้ผล
Franco Gil

102

axiox.deleteไม่รองรับเนื้อหาคำขอ ยอมรับสองพารามิเตอร์: url และ config ที่เป็นทางเลือก คุณสามารถใช้config.dataเพื่อตั้งค่าเนื้อหาและส่วนหัวของคำขอดังต่อไปนี้:

axios.delete(url, { data: { foo: "bar" }, headers: { "Authorization": "***" } });

ดูที่นี่ - https://github.com/axios/axios/issues/897


สิ่งนี้คือฉันต้องการส่งเนื้อหาและส่วนหัวในคำขอลบเดียวกัน
Asfourh hundred

83

นี่คือสรุปสั้น ๆ ของรูปแบบที่จำเป็นในการส่งคำกริยา http ต่างๆด้วย axios:

  • GET: สองทาง

    • วิธีแรก

      axios.get('/user?ID=12345')
        .then(function (response) {
          // Do something
        })
      
    • วิธีที่สอง

      axios.get('/user', {
          params: {
            ID: 12345
          }
        })
        .then(function (response) {
          // Do something
        })
      

    สองข้อข้างต้นเทียบเท่ากัน สังเกตparamsคำสำคัญในวิธีที่สอง

  • POST และ PATCH

    axios.post('any-url', payload).then(
      // payload is the body of the request
      // Do something
    )
    
    axios.patch('any-url', payload).then(
      // payload is the body of the request
      // Do something
    )
    
  • DELETE

    axios.delete('url', { data: payload }).then(
      // Observe the data keyword this time. Very important
      // payload is the request body
      // Do something
    )
    

ประเด็นที่สำคัญ

  • getคำขอเป็นทางเลือกที่จำเป็นต้องมีparamsคีย์เพื่อตั้งค่าพารามิเตอร์การสืบค้นอย่างถูกต้อง
  • deleteการร้องขอกับร่างกายจำเป็นต้องตั้งค่าไว้ใต้dataคีย์

11
คำตอบของคุณทำให้ฉันหวังว่าจะมีคุณสมบัติเพิ่มคะแนน +2 ใน stack overflow
eli-bd

นี่เป็นคำตอบเดียวที่อธิบายรายละเอียดได้ ขอบคุณจริงๆที่ช่วยในการทำความเข้าใจแม้แต่คนอื่น ๆ
เจฟฟ์

จะส่งคำขอลบด้วยพารามิเตอร์ไม่ใช่เนื้อหาได้อย่างไร
Ajay Singh

คำตอบที่ดีที่สุดสำหรับคำถามนี้ ขอขอบคุณ.
HartleySan

1
@MaFiA หากคุณต้องการส่งคำขอลบด้วย params คุณสามารถใส่ไว้ใน url โดยใช้สตริงการค้นหา
Van_Paitin

14

แกน การลบจะถูกส่งผ่าน url และการกำหนดค่าเพิ่มเติม

axios.delete (url [, config])

เขตข้อมูลที่สามารถใช้ได้กับการตั้งค่าสามารถรวมส่วนหัว

สิ่งนี้ทำให้การเรียก API สามารถเขียนเป็น:

const headers = {
  'Authorization': 'Bearer paperboy'
}
const data = {
  foo: 'bar'
}

axios.delete('https://foo.svc/resource', {headers, data})

สิ่งนี้ใช้ไม่ได้สำหรับฉัน ... ฉันมีconst headers = {'Authorization': ...}และdata = {'username': ...}ลงเอยด้วยaxios.delete('http://...', {headers, data})แต่เซิร์ฟเวอร์ไม่สามารถเข้าถึงส่วนหัวได้ ...
Asfourh hundred

คำขอออกจากเบราว์เซอร์บอกว่าแตกต่างกัน ดู Stackblitz นี้ ( stackblitz.com/edit/react-gq1maa ) และคำขอในแท็บเครือข่ายเบราว์เซอร์ ( snag.gy/JrAMjD.jpg ) คุณต้องแน่ใจว่าคุณกำลังอ่านเซิร์ฟเวอร์ส่วนหัวในทางที่ถูกต้องหรือคำขอนั้นไม่ได้ถูกดักจับและถูกดัดแปลง
Oluwafemi Sule

6

ฉันมีปัญหาเดียวกันฉันก็แก้ไขเช่นนั้น:

axios.delete(url, {data:{username:"user", password:"pass"}, headers:{Authorization: "token"}})

5

ที่จริงaxios.deleteรองรับเนื้อหาที่ร้องขอ
มันรับสองพารามิเตอร์: กและตัวเลือกURL configนั่นคือ...

axios.delete(url: string, config?: AxiosRequestConfig | undefined)

คุณสามารถทำสิ่งต่อไปนี้เพื่อตั้งค่าเนื้อหาตอบกลับสำหรับคำขอลบ:

let config = { 
    headers: {
        Authorization: authToken
    },
    data: { //! Take note of the `data` keyword. This is the request body.
        key: value,
        ... //! more `key: value` pairs as desired.
    } 
}

axios.delete(url, config)

ฉันหวังว่านี่จะช่วยใครสักคน!


1
ขอบคุณฉันใช้สิ่งนี้ในเมธอดการลบ NestJs HttpService ของฉันเป็น: this.httpService.delete (apiUrl, {headers: headersRequest, data: deleteBody})
shanti


2

ในการส่ง HTTP DELETE พร้อมส่วนหัวบางส่วนผ่านaxiosฉันได้ทำสิ่งนี้:

  const deleteUrl = "http//foo.bar.baz";
  const httpReqHeaders = {
    'Authorization': token,
    'Content-Type': 'application/json'
  };
  // check the structure here: https://github.com/axios/axios#request-config
  const axiosConfigObject = {headers: httpReqHeaders}; 

  axios.delete(deleteUrl, axiosConfigObject);

axiosไวยากรณ์สำหรับ HTTP กิริยาที่แตกต่างกัน (GET, POST, PUT ลบ) เป็นเรื่องยุ่งยากเพราะบางครั้งพารามิเตอร์ 2 ควรจะเป็นร่างกาย HTTP บางเวลาอื่น ๆ (ตอนที่มันอาจจะไม่จำเป็น) คุณเพียงแค่ผ่านส่วนหัวเป็นพารามิเตอร์ที่ 2 .

อย่างไรก็ตามสมมติว่าคุณต้องส่งคำขอ HTTP POST โดยไม่มีเนื้อความ HTTP จากนั้นคุณต้องส่งผ่านundefinedเป็นพารามิเตอร์ที่ 2

โปรดทราบว่าตามคำจำกัดความของวัตถุการกำหนดค่า ( https://github.com/axios/axios#request-config ) คุณยังสามารถส่งผ่านเนื้อหา HTTP ในการโทร HTTP ผ่านdataฟิลด์เมื่อโทรaxios.deleteอย่างไรก็ตามสำหรับ HTTP DELETE คำกริยาจะถูกละเว้น

ความสับสนระหว่างพารามิเตอร์ที่ 2 บางครั้งเป็นเนื้อความ HTTP และในบางครั้งconfigออบเจ็กต์ทั้งหมดaxiosเกิดจากการใช้กฎ HTTP บางครั้งไม่จำเป็นต้องใช้เนื้อหา HTTP เพื่อให้การเรียก HTTP ถือว่าถูกต้อง


0

ฉันพบปัญหาเดียวกัน ... ฉันแก้ไขได้โดยสร้างอินสแตนซ์ axios ที่กำหนดเอง และใช้สิ่งนั้นเพื่อทำการร้องขอการลบที่พิสูจน์ตัวตน ..

const token = localStorage.getItem('token');
const request = axios.create({
        headers: {
            Authorization: token
        }
    });

await request.delete('<your route>, { data: { <your data> }});

0

ฉันพบวิธีที่ได้ผล:

axios
      .delete(URL, {
        params: { id: 'IDDataBase'},
        headers: {
          token: 'TOKEN',
        },
      }) 
      .then(function (response) {
        
      })
      .catch(function (error) {
        console.log(error);
      });

ฉันหวังว่างานนี้สำหรับคุณเช่นกัน


0

ฉันลองทุกข้อข้างต้นซึ่งไม่ได้ผลสำหรับฉัน ฉันลงเอยด้วยการ PUT (พบแรงบันดาลใจที่นี่ ) และเพิ่งเปลี่ยนตรรกะฝั่งเซิร์ฟเวอร์ของฉันเพื่อทำการลบในการเรียก url นี้ (ฟังก์ชัน django rest framework แทนที่)

เช่น

.put(`http://127.0.0.1:8006/api/updatetoken/20`, bayst)
      .then((response) => response.data)
      .catch((error) => { throw error.response.data; });
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.