프로토타입에서는 서버와 데이터 주고받는걸 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 사용가능ㅎㅎ