Eclipse ✕ Android ✕ MySQL その2
サーバ側とAndroid側の通信を行います \(^o^)/
前回JDBCを使った方法でやりましたが、実機に入れるとできませんでしたorz
頑張ったんだけどね(;´∀`)
自分の実機に対応してなかったみたいです(´・ω・`)
てことで、違う方法を考えいました。
【MySQL】→【Json】 送る 【Json】→【Android】
の方法でデータの読み込みをすることにしました。
まずはMySQLをJsonファイルにすることから!
今回は PerlCGI 利用することにしました。
まずはサーバ側の設定から。
Webサーバー構築(Apache) - CentOSで自宅サーバー構築
次に確認。
http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/pe_kj01.htm
#!/usr/local/bin/perl print "Content-type: text/html\n\n"; print "<HTML>\n"; print "<P>はじめての CGI-Perl ですのん。</P>\n"; print "</HTML>\n";
これで確認できたらおk( ´∀`)bグッ!
今回はGETメソッドを使います。
Twitterとかでよくあるあれですよ。。。
例:ATNDhttp://api.atnd.org/events/?keyword=android&format=json
【MySQL】
host :192.168.100.200
database :sample
table :first_mysql
user :root
password :
※iptableは切っています。
http://d.hatena.ne.jp/uriyuri/20080704/1215164085
/etc/rc.d/init.d/iptables stop
【参考】
[Perl] データベースから取得したレコードをJSON形式で出力する – 極上の人生
入力フォーム編(GETとPOSTデータを受け取るには) - futomi's CGI Cafe
#!/usr/local/bin/perl use strict; use warnings; use CGI; use DBI; use JSON; my $cgi = CGI->new(); my $where_string = $cgi->param('WHERE_STRING'); my %forminh = &get_arg(); #データベース接続情報 my $data_source = 'DBI:mysql:sample:192.168.100.200'; my $username = 'root'; my $auth = ''; my $dbh = DBI->connect($data_source, $username, $auth); $dbh->do("SET NAMES utf8"); #SQL文:select * from first_mysql where RECORD_ID='rally024'; my $sql = "select * from first_mysql where RECORD_ID='".$forminh{id}."';"; my $sth = $dbh->prepare($sql); $sth->execute(); my $JSON = '['; # JSONハッシュの配列にするので while ( my $ref = $sth->fetchrow_hashref() ){# ハッシュ参照を順次取り出し $JSON .= (JSON->new->encode($ref).', ');# JSON文字列に変換して連結 } $JSON =~ s/,.$//s; # 最後のカンマを除去(正規表現を使用) $JSON .=']'; print $cgi->header(-content_type => "application/json",-charset => "utf-8"); print $JSON; #GETメソッド sub get_arg{ my %forminh; my ($formin,$name,$value,$tmp,@indata); $formin= $ENV{'QUERY_STRING'}; #データを受け取り変数へ @indata = split (/&/,$formin); #受け取ったデータを&で区切り、配列へ foreach $tmp (@indata) #フォームの要素分(配列分)以下の処理を繰り返す { ($name,$value) = split (/=/,$tmp); # =記号で区切り、名前 と 値 に $forminh{$name} = $value; #区切った名前を付けた連想配列に } return (%forminh); }
http://192.168.100.200/test/sample.cgi?id=skwaon077
のように?の後に情報を入力するとできますv( ̄Д ̄)v イエイ
【苦労したところ】
MIMEタイプ: text/html → application/json に変更。
print $cgi->header(-content_type => "application/json",-charset => "utf-8");
よーし!これでサーバ側は終わり。
次はAndroid側です!!
まずはNetwork通信ができるためにAndroidManifest.xmlを編集。
ソフトウェア雑記 ネットワークに接続する場合の定義
<uses-permission android:name="android.permission.INTERNET" />
【参考】
http://techbooster.jpn.org/andriod/application/1645/
public class Etc11 extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); String id = "skwaon077"; HttpClient httpClient = new DefaultHttpClient(); String url_string = "http://192.168.100.200/test/sample.cgi?id=" + id; StringBuilder uri = new StringBuilder(url_string); HttpGet request = new HttpGet(uri.toString()); HttpResponse httpResponse = null; try { //AndroidManifest.xmlに<uses-permission android:name="android.permission.INTERNET" />が必要。 httpResponse = httpClient.execute(request); } catch (Exception e) { Log.d("JSONSampleActivity", "Error Execute"); Toast.makeText(getApplicationContext(), e.toString() , Toast.LENGTH_LONG).show(); return; } int status = httpResponse.getStatusLine().getStatusCode(); String data = null; if (HttpStatus.SC_OK == status) { try{ ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); httpResponse.getEntity().writeTo(outputStream); data = outputStream.toString(); // JSONデータ } catch (Exception e) { Log.d("JSONSampleActivity", "Error"); Toast.makeText(getApplicationContext(), e.getMessage() , Toast.LENGTH_LONG).show(); } } else { Log.d("JSONSampleActivity", "Status" + status); Toast.makeText(getApplicationContext(),"失敗"+ status, Toast.LENGTH_LONG).show(); return; } //JSONArray にJsonファイルを格納 JSONArray coupon = null; Toast.makeText(getApplicationContext(),"成功"+data, Toast.LENGTH_LONG).show(); try { coupon = new JSONArray(data); } catch (JSONException e2) { // TODO 自動生成された catch ブロック Toast.makeText(getApplicationContext(),"失敗", Toast.LENGTH_LONG).show(); e2.printStackTrace(); } //リスト表示するために必要 ArrayList words = new ArrayList(); for (int i = 0; i < coupon.length(); i++) { JSONObject o = null; try { o = coupon.getJSONObject(i); } catch (JSONException e1) { // TODO 自動生成された catch ブロック Toast.makeText(getApplicationContext(), e1.getMessage() , Toast.LENGTH_LONG).show(); e1.printStackTrace(); } String message=null; try { message = o.getString("RECORD_NAME"); } catch (JSONException e) { // TODO 自動生成された catch ブロック Toast.makeText(getApplicationContext(), e.getMessage() , Toast.LENGTH_LONG).show(); } //Toast.makeText(getApplicationContext(), message , Toast.LENGTH_LONG).show(); words.add(message); } //リスト表示 ArrayAdapter<String> la = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, words); // main.xmlのListViewにlaをセットします。 ListView lv = (ListView)findViewById(R.id.twitter); lv.setAdapter(la); }
データベースにあるデータを読み込み、リスト表示します。
【苦労したところ】
httpResponse = httpClient.execute(request);
でエラーになる。
AndroidManifest.xmlに
の書き忘れ /(^o^)\ナンテコッタイ
以上。
お疲れ様でした \(^o^)/
脆弱性が半端無いので、対策しましょう (。-`ω-)うん