Develop/Android
[Android] JSON 데이터 송수신
크레이지제이
2023. 3. 18. 20:39
반응형
안드로이드 스튜디오에서 okhttp3를 사용하여 JSON 데이터를 비동기 방식으로 전송하고 수신하는 코드는 다음과 같습니다.
(참고 app: build.gradle의 dependencies에 추가)
implementation 'com.squareup.okhttp3:okhttp:4.9.3'
(manifest에 권한 추가)
<uses-permission android:name="android.permission.INTERNET"/>
import okhttp3.*;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
public class MainActivity extends AppCompatActivity {
private OkHttpClient client = new OkHttpClient();
private MediaType JSON = MediaType.parse("application/json; charset=utf-8");
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// JSON 객체 생성
JSONObject json = new JSONObject();
try {
json.put("name", "John Doe");
json.put("age", 30);
} catch (JSONException e) {
e.printStackTrace();
}
// RequestBody 생성
RequestBody body = RequestBody.create(json.toString(), JSON);
// Request 생성
Request request = new Request.Builder()
.url("https://example.com/api")
.post(body)
.build();
// 비동기 방식으로 요청 전송
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (!response.isSuccessful()) {
throw new IOException("Unexpected code " + response);
}
// 수신된 JSON 데이터 디버그 로그로 출력
try {
String responseData = response.body().string();
JSONObject receivedJson = new JSONObject(responseData);
Log.d("Received JSON", receivedJson.toString());
} catch (JSONException e) {
e.printStackTrace();
}
}
});
}
}
* 에러 관련
not permitted by network security policy
- 버전이 올라가면서 기본적으로 http는 거부한다.. 이런 에러를 만날 것이다.
android okhttp not permitted by network security policy
해결방안은...
manifest, application 태그
android:usesCleartextTraffic="true"
- 하지만 스토어에 등록은 안될 것이다!!. https에 SSL 인증까지 해야 등록가능..
- 즉, 테스트 용도에서는 가능.
NetworkOnMainThreadException , StrictMode$AndroidBlockGuardPolicy
- 메인 쓰레드에서 네트웍을 블로킹방식 ( execute() )으로 하게 되면 만나는 에러...
- 쓰레드를 만들어 돌리든지, 비동기 방식으로 변경..
new Thread() {
public void run() {
try {
listFile();
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
}.start();