サーバレス練習帳

着眼大局着手小局

【android】RESTコールするぞ!

AndroidからAWS API GatewayにRESTコールするプログラムを作ります。(test03)

構成

Android -> AWS API Gateway -> AWS Lambda

API GatewayはGETメソッドで受けて、Lambdaが"Hello from Lambda!"というbodyを返します。
Lambadはpython3.7の初期プログラムから変更していません。



ソースコード

AWS Lambda : lambda_function.py : python3.7

import json

def lambda_handler(event, context):
    print(json.dumps(event))
    # TODO implement
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

Android : MainActivity.java : java

package com.example.test3;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.widget.TextView;
import android.widget.Button;
import android.widget.EditText;
import android.view.View;
import android.os.Handler;

// REST Call
import java.net.HttpURLConnection;
import java.net.URL;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.InputStream;

public class MainActivity extends AppCompatActivity  implements View.OnClickListener {

    private TextView mText;
    private Button mButton;
    private EditText mEdit;
    private Handler handler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //変数定義
        setContentView(R.layout.activity_main);
        mText = (TextView) findViewById(R.id.text01);
        mButton = (Button) findViewById(R.id.button01);
        mEdit = (EditText) findViewById(R.id.editText01);
        HttpURLConnection httpConn = null;
        findViewById(R.id.button01).setOnClickListener(this);
        findViewById(R.id.text01).setOnClickListener(this);
        handler = new Handler();
    }

    @Override
    public void onClick(View v) {
        if (v != null) {
            mText.setText("押されました!");
            switch (v.getId()) {
                case R.id.button01:
                    mText.setText("ボタンが押されました!");
                    HttpCall();
                    break;

                case R.id.text01:
                    mText.setText("テキストが押されました!");
                    break;

                default:
                    break;
            }
        }
    }

    public void HttpCall() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    URL url = new URL("https://www.drk7.jp/weather/xml/27.xml");
                    HttpURLConnection con = (HttpURLConnection)url.openConnection();
                    final String str = InputStreamToString(con.getInputStream());
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            mText.setText(str);
                        }
                    });
                } catch(Exception ex) {
                    System.out.println(ex);
                    mText.setText(ex.getMessage());
                    //mEdit.setText(ex.getMessage());
                }
            }
        }).start();
    }

    private String InputStreamToString(InputStream is) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        StringBuilder sb = new StringBuilder();
        String line;
        while ((line = br.readLine()) != null) {
            sb.append(line);
        }
        br.close();
        return sb.toString();
    }
}


参考

HTTP Request
qiita.com

メインスレッド以外でUIを変更する

accelebiz.hatenablog.com

マニュフェストにインターネット接続許可を追記することも忘れずに。

<uses-permission android:name="android.permission.INTERNET" />

github.com


エクセプションは次のようにストリング型にすれば、UIに表示できます。

catch(Exception ex) {
  System.out.println(ex);
  mText.setText(ex.getMessage());
}