Angular 2フロントエンドからややRESTfulなAPIと通信しようとしています。
コレクションから一部のアイテムを削除するには、削除する一意のID(URLに追加可能)に加えて、認証トークン、コレクション情報、補助データなどのデータを送信する必要があります。
私が見つけた最も簡単な方法は、リクエストヘッダーに認証トークンを入れ、本体に他のデータを入れることです。
ただし、Angular 2のHttpモジュールは、ボディを持つDELETEリクエストをまったく承認せず、このリクエストを実行しようとします
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
このエラーを与える
app/services/test.service.ts(67,4): error TS2346: Supplied parameters do not match any signature of call target.
今、私は何か間違った構文をやっていますか? RFCごとにDELETE本体がサポートされていると確信しています
そのデータを送信するより良い方法はありますか?
または、ヘッダーにダンプして1日だけ呼び出す必要がありますか?
この難問についての洞察をいただければ幸いです
@ angular/httpからのhttp.jsでの定義:
delete(url、オプション)
リクエストは本文を受け付けないため、URI内のデータ以外の選択肢はないようです。
特に、RFCに対応する参照を含む別のトピックを見つけました。 ヘッダー以外のajax DELETEリクエストでデータを渡す方法
Http.delete(url、options)は本文を受け入れます。オプションオブジェクト内に配置するだけです。
http.delete('/api/something', new RequestOptions({
headers: headers,
body: anyObject
}))
参照オプションインターフェイス: https://angular.io/api/http/RequestOptions
更新:
上記のスニペットは、Angular 2.x、4.x、および5.xでのみ機能します。
バージョン6.xおよび7.xの場合、Angularは必要なものに対して異なるオーバーロードを提供します。ここですべてのオーバーロードを確認してください: https://angular.io/api/common/http/HttpClient#delete
const options = {
headers: new HttpHeaders({
'Content-Type': 'application/json',
}),
body: {
id: 1,
name: 'test',
},
};
this.httpClient
.delete('http://localhost:8080/something', options)
.subscribe((s) => {
console.log(s);
});
body
メソッドを使用して、実際にAngular2 HTTP
をだましてDELETE
をrequest
で送信することができます。こうやって:
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)});
注:http.request
の代替の最初のパラメーターRequestOptionsArgs
ではなく、Request
で要求メソッドを設定する必要があります。何らかの理由で、http.delete
を使用した場合と同じ結果が得られる
これがお役に立てば幸いです。 angularの人たちはここでは間違っていると思う。
Angular 5では、削除する代わりにrequestメソッドを使用して本文を送信する必要がありました。 deleteメソッドのドキュメントにはbodyは含まれていませんが、requestメソッドには含まれています。
import { HttpClient } from '@angular/common/http';
import { HttpHeaders } from '@angular/common/http';
this.http.request('DELETE', url, {
headers: new HttpHeaders({
'Content-Type': 'application/json',
}),
body: { foo: bar }
});
以下は、新しいHttpClientを使用したAngular 4/5に関連するコード例です。
import { HttpClient } from '@angular/common/http';
import { HttpHeaders } from '@angular/common/http';
public removeItem(item) {
let options = {
headers: new HttpHeaders({
'Content-Type': 'application/json',
}),
body: item,
};
return this._http
.delete('/api/menu-items', options)
.map((response: Response) => response)
.toPromise()
.catch(this.handleError);
}
Angular 6を使用する場合、http.request
メソッドにbodyを配置できます。
あなたはこれを試すことができます、私にとってはうまくいきます。
import { HttpClient } from '@angular/common/http';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss'],
})
export class AppComponent {
constructor(
private http: HttpClient
) {
http.request('delete', url, {body: body}).subscribe();
}
}
以下はAngular 6の例です
deleteAccount(email) {
const header: HttpHeaders = new HttpHeaders()
.append('Content-Type', 'application/json; charset=UTF-8')
.append('Authorization', 'Bearer ' + sessionStorage.getItem('accessToken'));
const httpOptions = {
headers: header,
body: { Email: email }
};
return this.http.delete<any>(AppSettings.API_ENDPOINT + '/api/Account/DeleteAccount', httpOptions);
}
RESTは、DELETE要求で本文を含めることを妨げませんが、最も標準化されているため、クエリ文字列を使用することをお勧めします(データを暗号化する必要がない限り)
私はそれを次のようにしてangular 2で動作するようにしました:
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(...)
以下は、Angular 2/4/5プロジェクトに関連するコード例です。
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;
});
body
がRequestOptions
を介して渡されることに注意してください。