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

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

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

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Java

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

サーブレット

サーブレット(Servlets)とはウェブやアプリケーションサーバー上に動くプログラムのことであり、ウェブブラウザや他のHTTPクライエントとデータベースやHTTPサーバー上のアプリケーションの中間層としての働きをします。

Q&A

解決済

2回答

3554閲覧

jsonを返すサーブレットの作成

m1st

総合スコア21

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Java

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

サーブレット

サーブレット(Servlets)とはウェブやアプリケーションサーバー上に動くプログラムのことであり、ウェブブラウザや他のHTTPクライエントとデータベースやHTTPサーバー上のアプリケーションの中間層としての働きをします。

0グッド

0クリップ

投稿2019/01/12 06:27

編集2019/01/12 09:08

現在andoroidとサーブレットの通信部分を作るにあたり、jsonを取得しjsonを返すサーブレットを作成しようと考えています。
プログラムは以下の通りです。

java

1import java.io.BufferedReader; 2import java.io.IOException; 3import java.io.PrintWriter; 4 5import javax.servlet.ServletException; 6import javax.servlet.annotation.WebServlet; 7import javax.servlet.http.HttpServlet; 8import javax.servlet.http.HttpServletRequest; 9import javax.servlet.http.HttpServletResponse; 10 11import org.json.JSONException; 12import org.json.JSONObject; 13 14 15/** 16 * Servlet implementation class Sample 17 */ 18@WebServlet("/Sample") 19public class Sample extends HttpServlet { 20 private static final long serialVersionUID = 1L; 21 /** 22 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 23 */ 24 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 25 26 String id = null; 27 String password = null; 28 29 // get json 30 request.setCharacterEncoding("utf8"); 31 BufferedReader buffer = new BufferedReader(request.getReader()); 32 String reqJson = buffer.readLine(); 33 34 35 try { 36 JSONObject jsonObject = new JSONObject(reqJson); 37 id = jsonObject.getString("id"); 38 password = jsonObject.getString("password"); 39 } catch (JSONException e) { 40 e.printStackTrace(); 41 } 42 43 response.setContentType("application/json; charset=utf8"); 44 response.setCharacterEncoding("utf8"); 45 PrintWriter out = response.getWriter(); 46 47 48 try { 49 JSONObject obj = new JSONObject(); 50 obj.put("id", id); 51 obj.put("password", password); 52 out.print(obj.toString()); 53 } catch (JSONException e) { 54 e.printStackTrace(); 55 } 56 } 57}

上記のプログラムの内容はjson形式のidとpasswordを受け取り、受け取ったjsonをレスポンスのbodyに入れるというものです。
ここで、chromeの拡張機能を使用し、Advanced REST clientで下記のjsonをpostで送信しました。

json

1{ 2 "id": "tarou@gmail.com", 3 "password": "12345" 4}

結果、ステータスコード200で通信はできているのですが、レスポンスのbodyが空の状態で返ってきます。
レスポンスにjsonを入れるにはどうしたら良いのでしょうか?
ネット上で調べてみても中々わからなかったため質問させていただきました。未熟な質問ですいませんが回答のほどよろしくお願いいたします。

(追記)何度も試してみるうちに、リクエストのjsonを受け取る部分でidとpasswordをきちんと受け取れていないことがわかりました。ただ、この部分のコードのどこに間違いがあるのか分かりません。もしよろしければ回答のほどよろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

自己解決

サーブレットでリクエストボディを取得する
上記のサイトを参考にしたところ解決しました
ありがとうございました
ただ、なぜできなかったのかは分からない状態です....

投稿2019/01/12 10:39

m1st

総合スコア21

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

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

A-pZ

2019/01/14 08:03

d(・ω・
m1st

2019/01/14 08:09

コメントありがとうございます! A-pZさんのQiitaの記事を参考にし、無事サーバとAndroidを通信させることができました. 本当にありがとうございます.
guest

0

受信ができていると仮定して、jsonの値が思った値にならないということでしょうか。
jsonの値を作るには下記のようにしてみてください。

はずしていたら、ごめんなさい

String

1 response.setContentType("application/json;charset=utf-8"); 2 PrintWriter out = response.getWriter(); 3 4 out.println(message); 5 out.flush(); 6 out.close(); 7} 8 9 10public String doProcess(HttpServletRequest request, HttpServletResponse response) { 11 12 String message = null; 13 14 message = "{id:" + id + ",password:" + password +"}"; 15 16 return message; 17 } 18

投稿2019/01/12 08:23

senior_golfer

総合スコア264

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

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

m1st

2019/01/12 09:11

回答ありがとうございます。 どうやら追記にも書いた通りリクエストのjsonを正しく受け取れていないため、レスポンスのjsonを作成できていないことが原因だと思われます。 post通信により正しくjsonの受け取り方が分かるようでしたら、回答のほどよろしくお願いいたします。
senior_golfer

2019/01/12 09:32

Servletを使ってjson形式のデータを受け取って処理をすることはやったことがありません。 http://hogeという形でやっていましたので、役に立てません。 ただ、protected void doPostはdoGetとするのではないかと思います。 私が参考にして作成した処理では以下のようになっており、doPost以外は同じです。 /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
m1st

2019/01/12 10:33

>protected void doPostはdoGetとするのではないかと思います。 ここではidとpasswordという重要な情報を送られてくるためpostでの通信が一般的じゃないかと(getだと値を送るのがパラメータのため)
senior_golfer

2019/01/12 10:39

上記のようにpost形式での受信はわからないので、力になれません。 頑張ってください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問