프로토타입에서는 서버와 데이터 주고받는걸 volley라이브러리로 통신했었는데,

kotlin으로 마이그레이션 중 한참 해맸다..

DB에서 데이터를 파싱한다음 JSON으로 안드로이드에 전달하는 방법

 

아래 링크는 참고한 사이트!

https://velog.io/@ywown/kotlin-%ED%86%B5%EC%8B%A0-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%ACVolley-Retrofit

 

[kotlin] 통신 라이브러리(Volley, Retrofit)

안드로이드 HTTP 통신 라이브러리인 Volley와 Retrofit의 사용방법, 그리고 Retrofit Annotation에 대해 정리한 내용입니다.

velog.io

/// JAVA 코드

Java StringRequest 클래스

public class ApiRequest extends StringRequest {
    final static private String URL = "";
    private Map<String, String> parameters;

    public ApiRequest(String carNum, String svcCode, String insttCode, Response.Listener<String> listener) {
        super(Method.POST, URL, listener, null);
        parameters = new HashMap<>();
        parameters.put("carNum", carNum);
    }
    @Override
    protected Map<String, String> getParams() throws AuthFailureError {
        return parameters;
    }
}

Java Volley사용 예제

btn_carinfo.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        String carNum = carNumText.getText().toString();
        if (carNum.isEmpty()) {
            Toast.makeText(getApplicationContext(), " ", Toast.LENGTH_SHORT).show();
            return;
        }
        String URL = "";
        StrictMode.enableDefaults();

        Response.Listener<String> responseListener = new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                try {
                    JSONObject jsonData = new JSONObject(response); //json 객체 받아오기
                    JSONArray jsonArray = jsonData.getJSONArray(carNum); //받아온객체 jsondata변환 // DB에서 가져오도록 변경해야됨
                    jsonData = jsonArray.getJSONObject(0); //
                    
                    );
                    Toast.makeText(getApplicationContext(), "인증 성공", Toast.LENGTH_SHORT).show();

                } catch (JSONException e) {
                    Toast.makeText(getApplicationContext(), "데이터 호출 실패", Toast.LENGTH_SHORT).show();
                    e.printStackTrace();
                }
            }
        };
        dbRequest dbrequest = new dbRequest(carNum, URL, responseListener);
        RequestQueue queue = Volley.newRequestQueue(MainActivity.this);
        queue.add(dbrequest);
    }
});

 

 

//////// KOTLIN 코드

1. StringRequest 람다함수

val StringRequest = object : StringRequest(
    Request.Method.POST,
    getText(R.string.DataBaseURL).toString(),
    Response.Listener<String> { response ->
        Log.d("apiTestRes", "${response}")
        val jsonObject = JSONObject(response)
        val jsonArray = jsonObject.getJSONArray(carNum)
        val jsonData = jsonArray.getJSONObject(0)


    },
    Response.ErrorListener { error ->
        Log.d("apiTest", "error......$error")
    }) {

    @Throws(AuthFailureError::class)
    override fun getParams(): MutableMap<String, String>? {
        val params: MutableMap<String, String> = HashMap()
        params["carNum"] = carNum
        return params
    }
}

 

2. JSONRequest 람다함수

val JsonCarinfoRequest = object : JsonObjectRequest(
    Request.Method.POST,
    getText(R.string.DataBaseURL).toString(),
    null,
    Response.Listener<JSONObject> { response ->
        val jsonArray = response.getJSONArray(carNum)
        val jsonData = jsonArray.getJSONObject(0)

        Log.d("apiTestRes", "${response}")
        Log.d("apiTestNm", "${carNum}")
    },
    Response.ErrorListener { error ->
        Log.d("apiTest", "error......$error")
    }) {

    @Throws(AuthFailureError::class)
    override fun getParams(): Map<String, String>? {
        val params: MutableMap<String, String> = HashMap()
        params["carNum"] = carNum
        return params
    }
}

 

KOTLIN 사용예제

val queue = Volley.newRequestQueue(this)
queue.add(StringRequest) // 선언한 Request 추가

 

++++ 참고

기존에 DB데이터를 배열로 선언한 다음, PHP json_decode를 사용하여 화면에 출력,

해당 Response를 안드로이드에서 사용하였음.

 

하지만 JSONRequest를 사용할 때 HTML태그가 인식되어 

com.android.volley.ParseError: org.json.JSONException:

에러가 발생해서 한참 해맸었는데....

 

서버단에서 완전한 JSON타입으로 출력하던가,

이렇게 StringRequest로 받아와서 사용할 수 있음.

 

여기서는 PHP코드를 만들어놓은것도 있고,

시간상 JSON타입 출력은 추후 다시 만들던가 하고

실제 API에서 JSON타입으로 제공한다면 JSONObject 사용가능ㅎㅎ

+ Recent posts