質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
AngularJS

AngularJSはオープンソースのJavaScriptフレームワークです。ブラウザ上で動作するウェブアプリケーションの開発にMVCアーキテクチャを取り入れることを目的としています。

Q&A

解決済

2回答

3313閲覧

AngularJSで$http.jsonpでも401を拾いたい。

jcs502ulf

総合スコア307

AngularJS

AngularJSはオープンソースのJavaScriptフレームワークです。ブラウザ上で動作するウェブアプリケーションの開発にMVCアーキテクチャを取り入れることを目的としています。

0グッド

1クリップ

投稿2014/10/28 12:26

$httpでサーバーからHTTPステータス=401が返ってきても、$httpProviderでレスポンスエラーをインターセプトすると、なぜかステータスが404になってしまいます。
リクエストはjsonpなので、これが悪さをしている原因ではと考えております。
0. リクエスト(jsonp)
0. サーバーから401返却
0. $httpのレスポンス変換
0. $httpProviderでインターセプト
おそらく、上記処理の3番めのレスポンス変換で404になるのでは、と予想しているのですが、うまく401を拾う方法はないでしょうか。

2014/10/29追記

サーバーサイドはGlassfish 3.1でJava EE6のJAX-RSを使用しています。
以下に動作確認用のサーバーのプログラムソースを記載します。

lang

1 @GET 2 @Path("getMember") 3 @Produces("application/javascript") 4 public JSONWithPadding getMember( 5 @QueryParam("memberNo") final String memberNo, 6 @QueryParam("callback") String callback 7 ) { 8 throw new WebApplicationException(Response.Status.UNAUTHORIZED); 9 ...

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

すでにコメントがありますが、そもそもJSONPは仕組み上、GETメソッドを使用していると思います。
なので、POSTは正しく処理できないのではないでしょうか。

あまり詳しくないので推測ですが、以下のソースコードのjsonpReqにあるevent.type === "error"の条件に該当するルートを通っているのだとすると、404になるのではないかと思われます。
https://github.com/angular/angular.js/blob/d3b1f502e3099d91042a1827a006ad112ea67d36/src/ng/httpBackend.js

投稿2014/10/29 06:48

TaMaMhyu

総合スコア1356

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

話の単純化のために、インターセプターを外して、単純にリクエストを投げてみるといいのではないでしょうか。サーバー側のログも確認しながら。404が出ているということはjsonpリクエストがサーバー側の処理を含め、正しくない可能性がありますよね。
Docsの一番下に、JSONPのサンプルが実行できます。Invalid JSONPボタンで、404が帰ってきます。このようにjsonpリクエストが間違っていないことから確認したらどうでしょうか?

lang

1$http.jsonp("http://URL?callback=メソッド") 2.success(function(data, status, headers, config) { 3// 成功ログなど 4}) 5.error(function(data, status, headers, config) { 6// 失敗ログなど 7});

投稿2014/10/29 01:35

bonchan

総合スコア204

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jcs502ulf

2014/10/29 06:00

ご回答ありがとうございます。 サーバーサイドもこちらで構築しているのですが、インターセプターを外した正常パターンでは、問題なくjsonpが取得できます。 今回は認証チェックエラーのテストのために、サーバーでは明示的に401を返すようにしており、Chromeのデベロッパーツールでネットワークを監視すると、401が取得できているのですが、インターセプターでは404となってしまいます。 新しい情報として、HTTPメソッドをGETにすると、インターセプターでも401が取得できることが確認できました。
jcs502ulf

2014/10/29 06:59

クライアントからは$http.jsonpで呼び出しています。 それを$http.getに変えるとうまく401が取得できるのですが。
bonchan

2014/10/29 07:27

getに変えると動く件ですが、jsonpの仕様上正しいと思います。 jsonpのまま行おうとすると、jsonpのコールバックの中で(サーバー側でステータスコードを返却して、それを返すといった方法を)とらざるをえなくなると思います。 皆さんどう思われますか? (ただ、なぜインターセプトで404に変わるかは謎ですね) 以下、参考にしてください。http://stackoverflow.com/questions/5334413/parsing-jsonp-response-in-javascript-when-4xx-or-5xx-http-error-code-is-present
bonchan

2014/10/29 07:55

追記:上の理由から、java側でExceptionを投げているのはおかしいと思います。どうしてもやりたかったら、JSONにHttpStatusをマッピングして投げるしかないと思います。
jcs502ulf

2014/10/29 08:16

ご参考までに、Yahoo!のAPIを認証なしでリクエストすると、401が返ってくるのですが、やはりインターセプトで404になりますね。
jcs502ulf

2014/10/29 08:25

401以外にも403などが返ってきた時に、ステータスに合ったメッセージを表示するなどの処理をインターセプターで一元管理するのが本来の目的なのですが、401,403に加えて500も404になってしまうので、JSONPだと難しいのかもしれませんね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問