본문 바로가기

JAVA

[JAVA] OkHttp 사용법 + IllegalStateException 에러 원인/해결 방법

 

 

OkHttp는 REST API, HTTP 통신을 간편하게 사용할 수 있도록 만들어진 JAVA Library 이다.

오픈 소스로 공개된 소프트웨어 이기 때문에, 내부 동작이 궁금하면 코드를 열어볼 수 있다.

https://github.com/square/okhttp

 

GitHub - square/okhttp: Square’s meticulous HTTP client for the JVM, Android, and GraalVM.

Square’s meticulous HTTP client for the JVM, Android, and GraalVM. - GitHub - square/okhttp: Square’s meticulous HTTP client for the JVM, Android, and GraalVM.

github.com

 

 

 

1. 의존성 추가

 

1-1) Maven

 

<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>5.0.0-alpha.11</version>
</dependency>

 

 

1-2) Gradle

 

implementation group: 'com.squareup.okhttp', name: 'okhttp', version: '5.0.0-alpha.11'

 

 

 

2. Get 구현

 

OkHttpClient http;

@Transactional
public String getMobiusList() throws IOException {

    Response response = null;
    List<String> result = new ArrayList<>();

    String reData = null;
    
    // URL 로 parameter 전송
    String callUrl = "http://" + OPTIMIZATION_IP_ADDRESS + OPTIMIZATION_PORT + OPTIMIZATION_SERVICE_ID;

    try {
    	// 인스턴스 생성
        http = new OkHttpClient();
	
    	// get 요청 build
        Request.Builder builder = new Request.Builder().url(callUrl).get();
        
        // url header 설정
        builder.addHeader("", OPTIMIZATION_XM2MRI);
        builder.addHeader("", OPTIMIZATION_XM2MORIGIN);

		// request 객체 생성
        Request request = builder.build();
		// 결과 전달
        response = this.http.newCall(request).execute();
    } catch (Exception e) {
        String errorMsg = e.getMessage();
        log.error(errorMsg, e);
        response = null;
    }
    // 바디만 필요하여 바디 결과 값만 return
    return response.body().string();
}

 

 

3. POST 구현

 

public void postMobius(){
    // URL 로 parameter 전송
    String callUrl = "http://" + OPTIMIZATION_IP_ADDRESS + OPTIMIZATION_PORT + OPTIMIZATION_SERVICE_ID;

    try{
    	// 인스턴스 생성.
        http = new OkHttpClient();
        
        String postBody = "{\"param\":\"test\"}";
        
        //POST request body를 구성.
        RequestBody requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), postBody);
  
        // url header 설정
        builder.addHeader("", OPTIMIZATION_XM2MRI);
        builder.addHeader("", OPTIMIZATION_XM2MORIGIN);

		// request 객체 생성
        Request request = builder.build();
		// 결과 전달
        response = this.http.newCall(request).execute();
        
        //응답처리
        if(response.isSuccessful()){
       		ResponseBody body = response.body();
        	responseString = body.string();
        	System.out.println("[responseBody]:"+responseString);
            	body.close();
        }
    }catch(Exception e){
    	e.printStrackTrace();
        response = null;
}

 

 

JSONObject 를 사용하여 변환해 보내는 법도 있다.

 

  public static final MediaType JSON
      = MediaType.parse("application/json; charset=utf-8");

  OkHttpClient client = new OkHttpClient();

  JSONObject json = new JSONObject();
  json.put("test", "1111");
  json.put("test2", "2222");

  RequestBody body = RequestBody.create(JSON, json.toString());
  Request request = new Request.Builder()
        .url(url)
        .post(body)
        .build();
  Response response = client.newCall(request).execute();
  response.body().string();

 

 

 

주의사항

 

response.body().string() 은 딱 한 번만 호출해야 한다.

이상 호출 할 경우 해당 에러가 발생 한다.

 

java.lang.IllegalStateException : closed