2016-08-07 19 views
21

Tôi đang cố gắng nói chuyện với một API phần nào RESTful từ giao diện Angular 2.Nội dung của yêu cầu Http.DELETE trong Angular2

Để xóa một số mục khỏi bộ sưu tập, tôi cần gửi một số dữ liệu khác ngoài id duy nhất được xóa (có thể được thêm vào url), cụ thể là mã thông báo xác thực, một số thông tin thu thập và một số dữ liệu phụ trợ.

Cách đơn giản nhất mà tôi đã tìm thấy để làm như vậy là đặt mã thông báo xác thực vào tiêu đề yêu cầu và dữ liệu khác trong nội dung.

Tuy nhiên, các mô-đun Http của góc 2 không khá chấp nhận một yêu cầu DELETE với một cơ thể, và cố gắng để thực hiện yêu cầu này

let headers= new Headers(); 
headers.append('access-token', token); 

let body= JSON.stringify({ 
    target: targetId, 
    subset: "fruits", 
    reason: "rotten" 
}); 

let options= new RequestOptions({headers:headers}); 
this.http.delete('http://testAPI:3000/stuff', body,options).subscribe((ok)=>{console.log(ok)}); <------line 67 

cho lỗi này

app/services/test.service.ts(67,4): error TS2346: Supplied parameters do not match any signature of call target. 

Bây giờ, Tôi đang làm một cái gì đó sai cú pháp khôn ngoan? Tôi chắc rằng một cơ thể DELETE được hỗ trợ trên RFC

Có cách nào tốt hơn để gửi dữ liệu đó không?

Hoặc tôi chỉ nên đổ nó vào tiêu đề và gọi nó là một ngày?

Bất kỳ cái nhìn sâu sắc về câu hỏi hóc búa này sẽ được đánh giá

+0

sử dụng POST và đổi tên từ xóa để tìmVui lòng lưu ý. – YOU

+0

@YOU Có, nhưng tôi không nên cố gắng giữ các hành động phá hoại khác biệt với những hành động phá hoại ngay ở cấp yêu cầu? – TriTap

+0

sau đó bạn sẽ phải đặt nó trong chuỗi truy vấn, nhưng thông thường bạn đặt id của những gì bạn muốn yo xóa trong url, và bearer xác thực trong tiêu đề ajax để gửi yêu cầu xóa. – YOU

Trả lời

5

Định nghĩa trong http.js từ @ góc/http:

xóa (url, tùy chọn)

Yêu cầu không chấp nhận một cơ thể vì vậy có vẻ như lựa chọn duy nhất của bạn là nhưng dữ liệu của bạn trong URI.

Tôi tìm thấy một chủ đề với sự tham khảo tương ứng RFC, trong số những thứ khác: How to pass data in the ajax DELETE request other than headers

+0

Có vấn đề mở về github cho chủ đề này không? Tôi nghĩ rằng một tham số cơ thể tùy chọn chắc chắn nên được thêm vào. –

+6

Hai câu trả lời khác chứng minh câu trả lời này sai và nó không phải là câu trả lời được chấp nhận. – Hampus

+0

Các liên kết được cung cấp cho câu trả lời này chỉ để xóa jquery ajax, không Angular 2 như được chỉ định trên câu hỏi. Đây không phải là câu trả lời được chấp nhận. –

46

Các http.delete (url, options) không chấp nhận một cơ thể. Bạn chỉ cần đặt nó trong đối tượng tùy chọn.

http.delete('/api/something', new RequestOptions({ 
    headers: headers, 
    body: anyObject 
})) 

tham khảo lựa chọn giao diện: https://angular.io/docs/ts/latest/api/http/index/RequestOptions-class.html

+0

Cảm ơn bạn, đây chính là điều cần thiết! – LJH

+0

Cảm ơn bạn, đây chính là điều cần thiết! –

+0

Cảm ơn bạn, điều này dường như chính xác những gì họ cần (tôi cũng vậy, btw) –

8

Bạn đang thực sự có thể đánh lừa Angular2 HTTP vào gửi một body với một DELETE bằng cách sử dụng phương pháp request. Đây là cách:

let body = { 
    target: targetId, 
    subset: "fruits", 
    reason: "rotten" 
}; 

let options = new RequestOptionsArgs({ 
    body: body, 
    method: RequestMethod.Delete 
    }); 

this.http.request('http://testAPI:3000/stuff', options) 
    .subscribe((ok)=>{console.log(ok)}); 

Lưu ý, bạn sẽ phải thiết lập các phương thức yêu cầu trong RequestOptionsArgs và không thay thế tham số đầu tiên http.request 's Request. Điều đó vì một số lý do mang lại kết quả tương tự như việc sử dụng http.delete

Tôi hy vọng điều này sẽ giúp và tôi không đến muộn. Tôi nghĩ các anh chàng góc cạnh đã sai ở đây để không cho phép một cơ thể được thông qua với xóa, mặc dù nó không được khuyến khích.

+0

Tôi nhận ra rằng cuối n4nd0_o làm điều tương tự nhưng vẫn sử dụng phương pháp xóa gốc. Tôi sẽ để lại câu trả lời này dù sao cho một giải pháp thay thế. – Hampus

+0

Có @Hampus, về cơ bản chúng tôi cung cấp cùng một câu trả lời. Của bạn là một chút "tiết", tuy nhiên, cùng một giải pháp: D –

1

phần còn lại không ngăn cản bao gồm cơ thể với yêu cầu DELETE nhưng nó là tốt hơn để sử dụng chuỗi truy vấn vì nó là chuẩn hoá nhất (trừ khi bạn cần các dữ liệu được mã hóa)

tôi đã nhận nó để làm việc với góc 2 bằng cách làm như sau:

let options:any = {} 
option.header = new Headers({ 
    'header_name':'value' 
}); 

options.search = new URLSearchParams(); 
options.search.set("query_string_key", "query_string_value"); 

this.http.delete("/your/url", options).subscribe(...) 
0

Dưới đây là ví dụ mã thích hợp cho góc 2/4/5 dự án:

let headers = new Headers({ 
    'Content-Type': 'application/json' 
}); 

let options = new RequestOptions({ 
    headers: headers, 
    body: { 
    id: 123 
    } 
}); 

return this.http.delete("http//delete.example.com/delete", options) 
    .map((response: Response) => { 
    return response.json() 
    }) 
    .catch(err => { 
    return err; 
    }); 

Lưu ý rằng body được chuyển qua RequestOptions

Các vấn đề liên quan