angularアプリからAPI呼び出しをしようとしています。私がやりたいのは、コマンドparamを使用して投稿リクエストをAPIに送信することです。発信要求を通過するだけでなく、サーバー側で多くのテストを行いましたが、$_POST
もbody
データも存在しません。したがって、問題はこのコード内にあると確信しています。
public post(cmd: string, data: object): Observable<any> {
const params = new URLSearchParams();
params.set('cmd', cmd);
const options = new RequestOptions({
headers: this.getAuthorizedHeaders(),
responseType: ResponseContentType.Json,
params: params,
body: data,
withCredentials: false
});
console.log('Options: ' + JSON.stringify(options));
return this.http.post('http://t2w.dev/index.php', data, options)
.map(this.handleData)
.catch(this.handleError);
}
data
としてさまざまなJSON構造を試しましたが、これが私が送信しようとしているものの中核です:
{
"Username": "No thanks",
"Password": "Donno"
}
this.handleData
とthis.handleError
は、データとエラーを引数として取るメソッドで、必要なものを返します。
APIは、angularアプリ以外のどこからでもリクエストを実行するときに正常に動作する$_POST
を介して着信するものをすべて記録するように設定されています。これまでにやったこと:
URLSearchParams
の代わりに生のクエリを渡します。
RequestOptions
のコンソール出力オプション:{"method":null、 "headers":{"Content-Type":["application/json"]、 "Accept":["application/json"]、 "X-CLIENT-ID":[" 380954038 "]、" X-CLIENT-SECRET ":[" 5BgqRO9BMZ4iocAXYjjnCjnO7fHGN59WP8BTRZ5f "]}、" body ":" {} "、" url ":null、" params ":{" rawParams ":" "、" queryEncoder ": {}、 "paramsMap":{}}、 "withCredentials":false、 "responseType":1} VM8529:1 XHRの読み込みが完了しました:POST " http://t2w.dev/ index.php "。
データが送信されない理由は誰にもわかりませんか?
@trichetricheに感謝します。問題は私のRequestOptions
にありました。明らかに、投稿の使用中にparams
にbody
またはRequestOptions
を渡すことはできません。どちらかを削除するとエラーが発生し、両方を削除すると機能します。まだ私の問題に対する最終的な解決策はありませんが、私は今、何か作業をする必要があります。最終的な作業コード。
public post(cmd: string, data: string): Observable<any> {
const options = new RequestOptions({
headers: this.getAuthorizedHeaders(),
responseType: ResponseContentType.Json,
withCredentials: false
});
console.log('Options: ' + JSON.stringify(options));
return this.http.post(this.BASE_URL, JSON.stringify({
cmd: cmd,
data: data}), options)
.map(this.handleData)
.catch(this.handleError);
}
http.post の2番目のパラメーターはメッセージの本文、つまりペイロードであり、URL検索パラメーターではありません。そのパラメーターにdata
を渡します。
ドキュメント から
post(url: string, body: any, options?: RequestOptionsArgs) : Observable<Response>
public post(cmd: string, data: object): Observable<any> {
const params = new URLSearchParams();
params.set('cmd', cmd);
const options = new RequestOptions({
headers: this.getAuthorizedHeaders(),
responseType: ResponseContentType.Json,
params: params,
withCredentials: false
});
console.log('Options: ' + JSON.stringify(options));
return this.http.post(this.BASE_URL, data, options)
.map(this.handleData)
.catch(this.handleError);
}
また、最初のパラメーター(BASE_URL
)もチェックアウトする必要があります。到達したい完全なURL(クエリ文字列を除く)が含まれている必要があります。あなたがそれを与えた名前のために私は言及し、私は現在の値が何であるかしか推測できません(たぶんドメインだけでしょうか?)。
また、http本文で送信されるdata/payloadでJSON.stringify
を呼び出す必要もありません。
それでもエンドポイントに到達できない場合は、開発コンソールでブラウザーのネットワークアクティビティを調べて、送信されているものを確認します。次に、正しいヘッダーとボディを使用して正しいエンドポイントが呼び出されているかどうかをさらに判別できます。正しいと思われる場合は、POSTMANまたはFiddlerなどを使用して、エンドポイントをそのように(Angularの外で)ヒットできるかどうかを確認します。
はい、問題はここにあります。それは構文に関連しています。
これを使ってみてください
return this.http.post(this.BASE_URL, params, options)
.map(data => this.handleData(data))
.catch(this.handleError);
の代わりに
return this.http.post(this.BASE_URL, params, options)
.map(this.handleData)
.catch(this.handleError);
また、2番目のパラメーターは、urlパラメーターではなく、本文であると想定されています。
バックエンドが次のように見えるとしましょう:
public async Task<IActionResult> Post([FromBody] IList<UserRol> roles, string notes) {
}
次のようなHttpServiceがあります。
post<T>(url: string, body: any, headers?: HttpHeaders, params?: HttpParams): Observable<T> {
return this.http.post<T>(url, body, { headers: headers, params});
}
次に、パラメーターとして本文とメモを渡す方法を示します。//呼び出し方法
const headers: HttpHeaders = new HttpHeaders({
'Authorization': `Bearer XXXXXXXXXXXXXXXXXXXXXXXXXXX`
});
const bodyData = this.getBodyData(); // get whatever we want to send as body
let params: HttpParams = new HttpParams();
params = params.set('notes', 'Some notes to send');
this.httpService.post<any>(url, bodyData, headers, params);
(angular 7 ^を使用して)私にとってはうまくいきました。