FC2ブログ
ヽ|∵|ゝ(Fantom) の 開発blog? ホーム » Android »【Java】【Android】【PHP】【JSON】JSON を Java から送信して、PHP で受信する

【Java】【Android】【PHP】【JSON】JSON を Java から送信して、PHP で受信する  


 さらに前回の続き

 今回は逆に、Java から JSON を送信して、PHP で受け取ってみるテスト。

 色々サンプルを調べてみたが、URLConnectionHttpClient(Android) の例が多かったので、とりあえず、前回使った HttpURLConnection をそのまま使うことにした。また Android ではどちらかと言うと、URLConnection の方が推奨されているらしいので(軽量で実行速度も速いとか)、流用も簡単かも知れない。


 まずは JSON を受信する PHP の方から書いてみる。今回もエラー等は考慮に入れず、超絶簡単なコードにするので、必要なら適当に追加して欲しい。とりあえずファイル名を「json_in.php」とする。

■JSON 形式データ受信用 PHP(json_in.php)
<?php
require_once("JSON.php"); //JSON 変換ライブラリ

//リクエストの body 部から生のデータを読み込む
$input = file_get_contents('php://input');

//JSON のデコード
$json = new Services_JSON;
$data = $json->decode($input);

//以下確認用
header('Content-type: text/plain; charset=utf-8');

foreach($data as $key => $val) {
echo $key.' = '.$val."\n";
}
?>

 「確認用」のコードは本分と関係ないので、本来ならデータベース等に記録する処理などに変更すると良いだろう。

 以下の Java サンプルで JSON を POST で送っているが、PHP 側で $_POST で受け取ると余計なエスケープが付くので、読み取り専用の生のデータを取得するようにした。$HTTP_RAW_POST_DATA が使えるサーバなら、そちらでも良いかも知れない。ただ「php://」の方法なら、設定ファイル「php.ini」はいじらなくて済む利点がある。また試しに日本語も送ってみたが、"UTF-8" 固定ならば問題なく受信できた。


 次に JSON 送信用の Java コードを書いてみる。これも例外処理は手抜きなので、必要に応じて追加した方が良いかも知れない。また確認用に前回作った readLinesText() とデータ格納用構造体(クラス)、定数などもそのまま使っている。

■JSON 形式データ送信用 Java
//データ格納用クラス(構造体)[※前回と同じもの]
public class Data {
public String name;
public int age;
public boolean male;

public Data(String name, int age, boolean male) {
this.name = name;
this.age = age;
this.male = male;
}
}

//テストのメイン... (※例外処理は簡略)
final int CONNECT_TIMEOUT = 10 * 1000; //接続タイムアウト[ms]
final int READ_TIMEOUT = 5 * 1000; //読み取りタイムアウト[ms]
final String ENCORDING = "UTF-8"; //エンコードは固定

String phpUrl = "http://(テストするサーバー)/json_in.php"; //JSON 受信用 PHPのURL

try {
URL url = new URL(phpUrl);
HttpURLConnection con = (HttpURLConnection)url.openConnection();
con.setConnectTimeout(CONNECT_TIMEOUT); //接続タイムアウト
con.setReadTimeout(READ_TIMEOUT); //読み取りタイムアウト
con.setRequestMethod("POST"); //"GET"でも可
con.setDoOutput(true); //出力用接続フラグON
con.connect();

//適当にデータを定義
Data data4 = new Data("マック", 21, true);
// Data data4 = new Data("シンディ", 16, false);

//データ用クラス から、JSON 形式に変換
Gson gson = new Gson();
String text4 = gson.toJson(data4);

PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(con.getOutputStream(), ENCORDING)));
pw.write(text4); //出力
pw.close(); //フラッシュして閉じる

//PHP からの応答(確認用)
System.out.println("[Response]");
String res = readLinesText(con.getInputStream()); //※前回作ったもの
System.out.println(res);

con.disconnect();

} catch (Exception e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}

 結果は以下の通り。

[Response]
name = マック
age = 21
male = 1

 boolean 型は PHP 側では true → 1、 false → 空文字 になるので注意。

 HttpURLConnection の定義部分に関しては、前回のコード に setDoOutput(true) を追加して出力用接続をONにし、setRequestMethod() を POST に代えただけである。リクエストは GET でも構わない。以下のURLエンコードの方法の場合、データ量を考えないで済むので POST にした。また GET より POST の方が少しばかりデータの隠蔽性があるという利点もある。

 PHP 側で $_POST で受け取りたいなら、JSON エンコード後に、
String text4 = gson.toJson(data4);
String enc = URLEncoder.encode(text4, ENCORDING); //URLエンコードする
text4 = "data=" + enc; //POSTするクエリ

のように URL エンコードして、pw.write(text4) で書き出せば、PHP 側で $_POST['data'] で受け取れる。ただし、先に述べたように、$_POST の場合は余計なエスケープ('\')が付くので、stripslashes($_POST['data']) などして、エスケープを除去する必要がある。

 また、日本語を Unicode の表現 (\uffff) に変換しても可能だったが、JSON(GSON) 変換などで、更にエスケープ('\')が増えたりするので、デコードには要注意だ。送信側と受信側のエスケープの数のつじつま合わせをしなければならない。Java での Unicode 変換は非常に良いサンプルがあったので、参考に載せておこう。PHP 側の JSON デコードはライブラリが Unicode デコードも勝手にやってくれるみたいだ。日本語が絡むと色々複雑になってくるので、その辺は自由に書き換えて貰いたい。

(参考) JavaのUnicode文字列の変換用メソッド


(関連記事)
【Java】【PHP】【JSON】JSON を PHP から送信して、Java で受信する
【Java】【JSON】Google Gson(Json) を Eclipse にインポートして使う
【Java】【Android】【PHP】画像を PHP から送信して、Android で受信する
【MongoDB】【Windows】Windows版 MongoDB をインストールして使う


関連記事
スポンサーサイト



category: Android

thread: プログラミング

janre: コンピュータ

tag: PHP  JSON  通信 
tb: 0   cm: --


トラックバック

トラックバックURL
→http://fantom1x.blog130.fc2.com/tb.php/142-99f9a379
この記事にトラックバックする(FC2ブログユーザー)

プロフィール

Social

検索フォーム

全記事一覧

カテゴリ

ユーザータグ

最新記事

リンク

PR