[解決済み] Angular2のPOSTをx-www-form-urlencodedで強制する方法
質問
私は、Angular2(最終)を使用して、古い、レガシーTomcat 7サーバーに投稿し、.jspページを使用してややREST的なAPIを提供する必要があるプロジェクトを持っています。
プロジェクトが AJAX リクエストを実行する単純な JQuery アプリケーションであったときは、これはうまくいきました。しかし、プロジェクトの範囲が拡大したため、より近代的なフレームワークを使用して書き直す必要が出てきました。Angular2はこのプロジェクトに最適なフレームワークですが、1つだけ例外があります。それは、APIが抽出しないフォームデータ以外のオプションを使ったPOSTリクエストの実行を拒否することです。APIはすべてがurlencodeされることを期待し、Javaの
request.getParameter("param")
構文に依存して、個々のフィールドを抽出します。
これは私のuser.service.tsから抜粋したものです。
import { Injectable } from '@angular/core';
import { Headers, Response, Http, RequestOptions } from '@angular/http';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/map';
@Injectable()
export class UserService {
private loggedIn = false;
private loginUrl = 'http://localhost:8080/mpadmin/api/login.jsp';
private headers = new Headers({'Content-Type': 'application/x-www-form-urlencoded'});
constructor(private http: Http) {}
login(username, password) {
return this.http.post(this.loginUrl, {'username': username, 'password': password}, this.headers)
.map((response: Response) => {
let user = response.json();
if (user) {
localStorage.setItem('currentUser', JSON.stringify(user));
}
}
);
}
}
ヘッダーのコンテントタイプを何に設定しても、いつもエンコードされていないフォームデータとして到着してしまいます。私が設定したヘッダーを尊重しないのです。
他にこれに遭遇した人はいますか?Angular2が古いJava APIで読み取れる形式でデータをPOSTするために
request.getParameter("param")
?
編集 : 今後これを発見した人のために、解決策は実はとても簡単です。投稿の本文をこのように設定します。
let body = `username=${username}&password=${password}`;`
以下のBradの例を見てください。
どのように解決するのですか?
2020年6月に更新しました。この回答は4年前のもので、AngularのAPI変更により無効となりました。現在のバージョンのアプローチについては、より新しい回答を参照してください。
これを行うには
URLSearchParams
をリクエストのボディとして使用すると、angular は自動的にコンテンツタイプを
application/x-www-form-urlencoded
に設定し、ボディを適切にエンコードします。
let body = new URLSearchParams();
body.set('username', username);
body.set('password', password);
this.http.post(this.loginUrl, body).map(...);
現在動作していない理由は、ボディデータを正しい形式でエンコードしていないことと、ヘッダーオプションを正しく設定していないことです。
ボディをこのようにエンコードする必要があります。
let body = `username=${username}&password=${password}`;
このようにヘッダーオプションを設定する必要があります。
this.http.post(this.loginUrl, body, { headers: headers }).map(...);
関連
-
[解決済み] Javascriptで文字列の最後の文字を切り取るにはどうしたらいいですか?
-
[解決済み] フォーム送信のようなJavaScriptのポストリクエスト
-
[解決済み] POSTフォームのフィールドにアクセスする方法
-
[解決済み] 文字列のn番目の出現箇所を取得するには?
-
[解決済み] サブドメインにまたがってlocalStorageを使用する
-
[解決済み] $.ajax実行中にローディングイメージを表示する
-
[解決済み] Chromeのwebkitインスペクタで「Unsafe JavaScript attempt to access frame with URL...」というエラーが継続的に発生する。
-
[解決済み] Node.jsのES6クラスをrequireで作る
-
[解決済み] 変異を伴わないオブジェクトからの値の削除
-
[解決済み] リダイレクトされずにHTMLフォームを送信する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 上級者向けJavaScript。この関数はなぜ括弧でくくられるのですか?重複
-
[解決済み] Google maps API V3 - 同一地点に複数のマーカーを設置する。
-
[解決済み] Chart.jsを使ってドーナツチャートの中にテキストを追加するには?
-
[解決済み] javascript の関数から `undefined` と `null` のどちらを返すのが良いのでしょうか?
-
[解決済み] 無効になっている入力フィールドの値を送信する
-
[解決済み] JavaScriptで文字列を数値に変換する最速の方法は何ですか?
-
[解決済み] BlobからArrayBufferへ移行する方法
-
[解決済み] jQueryで入力ファイルが空かどうかをチェックする方法
-
[解決済み] 各オブジェクトに?重複
-
[解決済み] jQueryのバージョン1、バージョン2、バージョン3の違いは何ですか?[クローズド]