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

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

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

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

7709閲覧

HttpURLConnectionのPOSTを使った時のサーバー側でのPOSTデータの受け取り方がわかりません。

hiroppii

総合スコア38

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2016/03/05 09:30

編集2016/03/05 09:45

###前提・実現したいこと
HttpURLConnectionを使ってサーバー側へPOSTデータの送信をし、PHPを使って受け取りたいと思っています。

###発生している問題・エラーメッセージ
POSTデータの送信は、サーバーのログファイルにPOSTするたびに、ログが取れていて、javaの方ではきちんと値が入っている状態なのですが、php側で$_POST['sampleId'];と記述してもデータが取れません。java側でjsonObjectを使っているので、そう言うものも関係しているのでしょうか。

javaの記述は、下記のサイトを参考にさせて頂きました。有難う御座います。
http://blog.a1yama.com/entry/2016/01/26/154932

###ソースコード
public class Test extends AsyncTask<String, String, String> {
private TestActivity _sample;

public Test(TestActivity sample) { super(); _sample = sample; } @Override protected String doInBackground(String...value) { String sampleId = value[0]; String base_url = value[1]; BufferedReader reader = null; OutputStream os = null; HttpURLConnection urlCon = null; try { URL url = new URL(base_url); urlCon = (HttpURLConnection) url.openConnection(); urlCon.setReadTimeout(10000); urlCon.setConnectTimeout(20000); urlCon.setRequestMethod("POST"); urlCon.setDoInput(true); urlCon.setDoOutput(true); urlCon.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); urlCon.setUseCaches(false); urlCon.connect(); JSONObject jsonObject = new JSONObject(); jsonObject.put("sampleId", sampleId); // データを送信する os = urlCon.getOutputStream(); BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8")); writer.write(String.valueOf(jsonObject)); writer.flush(); writer.close(); os.close(); int status = urlCon.getResponseCode(); switch (status) { case HttpURLConnection.HTTP_OK: InputStream is = urlCon.getInputStream(); reader = new BufferedReader(new InputStreamReader(is)); String httpSource = new String(); String str; while (null != (str = reader.readLine())) { httpSource = httpSource + str; } is.close(); break; case HttpURLConnection.HTTP_UNAUTHORIZED: break; default: break; } } catch (Exception e) { e.printStackTrace(); } finally { try { if (reader != null) { reader.close(); } if (os != null) { os.close(); } if (urlCon != null) { urlCon.disconnect(); } } catch (IOException e) { e.printStackTrace(); } } return null; }

}

###補足情報(言語/FW/ツール等のバージョンなど)
android/php/

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

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

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

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

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

guest

回答3

0

自己解決

JSONを使わないソースで試したところ、$_POSTでデータの所得が出来ました。
尚、以下のサイトを参考にさせて頂きました。有難う御座います。

http://www.programing-style.com/android/android-api/android-httpurlconnection-post/

投稿2016/03/06 11:10

hiroppii

総合スコア38

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

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

0

JSONを利用してデータをPOSTし、結果を受け取る流れを自分でも調べてみました。

アプリ送信側 1.HttpUrlConnectionでサーバーコネクションを確立(setDoCoutput(true)が必須) 2.JSONObjectでPOSTしたいデータをエンコードする 3.コネクションからOutputStreamを開く 4.BufferedWriterのwrite()でストリームにJSONデータを書き込む 5.ストリームを閉じる サーバーサイド 1.POSTリクエストでPHPスクリプトへのアクセスとキー&値のデータを受け取る 2.PHPで受け取ったデータを処理する 3.PHPで定義したリターンを返す アプリ受信側 1.コネクションからInputStreamを開く 2.ストリームからPHPリターンを受け取る 3.ストリームを閉じる

これをAndroidの場合はAsyncTaskで非同期化して処理しなくてはいけないということですよね?

最初の質問では「アプリ送信~サーバーサイド」に問題ないはずということでしたが、
luckyclockさんの回答に対するコメントで

アクセスログが、HTTP/1.1" 200 20 "-" のままだった

とのことなので、アプリ送信側に問題がありそうですね。

記載のアクセスログではプロトコル、ステータスコード、バイト数、呼び出し元URLが記載されいらっしゃいますが、
日時、リクエストヘッダ、ファイル名はご確認なられましたでしょうか?
ファイル名が(存在はしていても)想定していたファイルじゃなかったなどは無いでしょうか?
PHPへのアクセス許可やPHPのサーバー実行、PHPファイルの実行許可が不適切な場合は
HTTP_OKは返ってこないんですよね、きっと…

投稿2016/03/05 23:18

Aeona

総合スコア396

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

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

hiroppii

2016/03/06 08:40 編集

回答ありがとうござます。 Androidの場合は、非同期化して処理をしないと駄目みたいです。 日時、リクエストヘッダ、ファイル名を確認しましたが、日時は送信した日時でしたし、POSTで、送信されていましたし、想定していたファイルでした。 PHPへのアクセス許可やPHPのサーバー実行、PHPファイルの実行許可が不適切かどうかを調べる為に、WebViewを使ってPOSTを行いましたところ、この方法ではきちんと$_POSTで、データが所得出来ました。
guest

0

https://teratail.com/questions/23915
こちらの質問と同じような内容かと思います。
そちらの質問の回答にも書きましたが、
私の場合os.close();の後に
InputStream in = conn.getInputStream();
入れたらPHP側でPOSTデータが取れました。
同じ原因かわかりませんが
os.close();
InputStream in = urlCon.getInputStream();
としてみてはどうでしょうか?

投稿2016/03/05 11:00

luckyclock

総合スコア73

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

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

hiroppii

2016/03/05 14:17

回答ありがとうござます。ご指摘のように、 os.close(); InputStream in = urlCon.getInputStream(); int status = urlCon.getResponseCode(); と記述しましたが、POSTデータは取れませんでした。 もしかしたらPOSTデータが、来ていないのかと思い、今一度確認しましたら、 POSTするデータが増えてもアクセスログが、HTTP/1.1" 200 20 "-" のままだったので、アクセス出来ていても、$_POSTのキーですら渡されていないといった状況なのかもしれません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問