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

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

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

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

Q&A

解決済

3回答

9979閲覧

Ajaxで「HTTPのGETメソッドは、このURLではサポートされていません。」エラー

rice

総合スコア70

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

0グッド

0クリップ

投稿2015/10/28 05:25

編集2015/10/28 09:44

自作したサーブレットに対してAJAXでPOST送信したのですが、AJAXの結果が上手く受け取れません。
Firefoxのデバッガで見ると「整形式になっていません。」と表示されており、該当のエラー行をクリックすると

<html><head><title>Error</title></head><body>HTTPのGETメソッドは、このURLではサポートされていません。</body></html>
と表示されます。
サーブレットにブレイクポイントを設定してデバッグしたところ、サーブレットには処理が来ていました。
おそらくサーブレットが返すレスポンスを受け取れないのかな、と考えています。

以下のように実装しています。※業務内容になる為、一部名称は変更しました。

[クライアント]

JavaScript

1 function checkArrival() { 2 clearTimeout(timer); 3 var hasNewArrival = false; 4 var xxxForm = $("#xxxForm"); 5 $.ajax({type : "POST", 6 url : "/aaa/bbb/TestServlet", 7 async : true, 8 data : xxxForm .serialize(), 9 dataType : "json", 10 success : function(json){ 11 hasNewArrival = json.newArrival; 12 }, 13 error : function(XMLHttpRequest, textStatus, errorThrown){ 14 console.log("Check new arrival error. status :" + textStatus); 15 }}); 16 17 if (!hasNewArrival) { 18 timer= setTimeout(checkArrival, 5000); 19 return; 20 } 21

[サーブレット]

Java

1 2public class TestServlet extends HttpServlet { 3 private static final String CONTENT_TYPE = "ContentType"; 4 5 private static final String CONTENT_TYPE_JSON = "application/json"; 6 7 @Override 8 protected void doPost(HttpServletRequest req, HttpServletResponse res) throws IOException { 9 doProcess(req, res); 10 } 11 protected void doProcess(HttpServletRequest req, HttpServletResponse res) throws IOException { 12 // 略 13 sendNormalResonse(res, result); 14 } 15 16 protected void sendNormalResonse(HttpServletResponse res, boolean result) throws IOException { 17 18 // 略 19 ObjectMapper mapper = new ObjectMapper(); 20 String bodyString = mapper.writeValueAsString(response); 21 res.setHeader(CONTENT_TYPE, CONTENT_TYPE_JSON); 22 res.setStatus(HttpServletResponse.SC_OK); 23 res.getWriter().write(bodyString); 24 } 25} 26

Ajax⇔Servletの実装は初めてなので、おかしな実装がないかご指摘頂けると助かります。
宜しくお願いいたします。

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

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

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

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

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

argius

2015/10/28 10:04 編集

CONTENT_TYPEとCONTENT_TYPE_JSONの中身の文字列は何になっていますか? ちなみに、res.setHeader(CONTENT_TYPE, CONTENT_TYPE_JSON);じゃなくてres.setContentType(CONTENT_TYPE_JSON)を使った方がシンプルかと思いますがいかがでしょうか。
rice

2015/10/28 09:43

恥ずかしながらContent-Typeのスペルミスがあり、それを修正したところエラー解消されました。 ContentType⇒Content-Type setContentで同様の効果があるのであれば、そちらを利用するようにしたいと思います。ありがとうございます!
argius

2015/10/28 09:48

解決されたようで何よりです。その旨を自己回答で書いて質問をクローズしていただけると助かります。
argius

2015/10/28 10:05

すみません、setContentじゃなくてsetContentTypeでした。
guest

回答3

0

恥ずかしながらServlet側で設定していたContent-Typeのスペルミスが原因でした。
setHeaderで"ContentType"という名称で設定していました。正しくは、"Content-Type"です。
HttpServletResponseクラスのsetContentTypeメソッドを利用しContent-Typeを設定する事で解決しました。

投稿2015/10/28 12:52

rice

総合スコア70

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

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

argius

2015/10/28 13:06

対応ありがとうございます。
guest

0

何らかの理由でGETで送信されているようですね。
こういうこともあるみたいですが、どうでしょうか。
ブラウザのPOSTリクエストは、リダイレクトさせるとGETに化ける? ::ハブろぐ

投稿2015/10/28 06:44

Lhankor_Mhy

総合スコア35871

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

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

rice

2015/10/28 08:49

回答ありがとうございます。 デバッガで見るとステータスは200=OKで返却されてきていますね。 IEでも確認したところServlet呼び出し後にsuccessで定義した関数には入ってきており、引数のjsonオブジェクトにもServletで設定したJSONオブジェクトが格納されてきます。 このsuccessで定義したメソッドを抜けたタイミングで 「ドキュメントの構文が無効です。 行: 1、列 1」と表示されました。 Firefoxと表示が異なりますがIEでも同じようなエラーとなりました。
rice

2015/10/28 08:58

XML5619: ドキュメントの構文が無効です。 行: 1、列 1 ↑XMLと認識されているのが気になります。 Firefoxのデバッガで見たところステータス:200で返ってきてますがタイプがXMLになっているのも気になります。
guest

0

ベストアンサー

問題の切り分けとして、まずServletが期待通りに動作しているか確認するのが良さそうです。

以下のページで紹介されているようなRESTAPIテストツールでServletにPOST通信し、期待通りのJSONが返却されるかご確認ください。(Servletのテストにも使えて便利なツールです)


追記です。
切り分けありがごとうございます。
たしかにそうなるとjavascript部分が疑わしいですね。

$.ajaxのパラメータとして以下がありますが、想定している形式のデータですか?
あまりjqueryに詳しくないのですが、以下だとクエリパラメータ形式になってしまうような気がします。
期待しているのはJSONオブジェクト({key:value, ...})ではないですか?
ご確認をお願いします。

javascript

1data : xxxForm .serialize(),

参考URL


すみません、Javascriptでのエラーはどの処理(行)で発生していますか?

投稿2015/10/28 05:59

編集2015/10/28 08:58
takyafumin

総合スコア2335

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

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

rice

2015/10/28 06:19

回答ありがとうございます。 CHROMEのRESTAPIツールで動作確認をしたところ、想定通りの内容でレスポンスが返却されてきています。 ですのでクライアント側の実装方法が悪い気がしています。 ・非同期処理のハンドリング方法がおかしい? ・JSON形式でのデータ送信方式がおかしい? 等を疑っているところです。POSTで送信しているにも関わらず、「HTTPのGETメソッドは、このURLではサポートされていません。」と表示されるのが解せません。 Chromeのデバッガで「ネットワーク」から見ていると確実にPOSTで送られているのですが。
eripong

2015/10/28 08:59

確認していないので違ったらすみません。 「該当のエラー行をクリックする」ことでGETリクエストが飛んでしまっている、とかでしょうか?
rice

2015/10/28 09:27

その通りでした!!GETの結果が返ってきているのではなく、ajax自体はPOSTで送信出来ておりました。 「HTTPのGETメソッドは、このURLではサポートされていません。」エラーは、リンクを押下した事でGETリクエストが飛んでしまった結果でした。 とするとエラーの内容は「整形式になっていません。」という物のみです。 Firefoxだとこの出方になるのですが、IEの場合だと「XML5619: ドキュメントの構文が無効です。 行: 1、列 1」となっています。 レスポンスオブジェクトの形式が悪いのかもしれません。
rice

2015/10/28 09:51

レスポンスオブジェクトをデバッガで見たところ、Content-Typeのスペルミスがありそれを修正したところ、エラー解消されました。 ご協力ありがとうございました!! ただ、別の問題でクライアントからJSONオブジェクトが送信出来ていません。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問