본문 바로가기

Spring Boot

[Spring Boot] OkHttp REST Client

pom.xml

 <dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
</dependency>

OkHttpSample.java ( 동기)

package com.example.demo;

import org.springframework.stereotype.Service;

import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import okhttp3.ResponseBody;

@Service
public class OkHttpSample {
	
	// get TEST
	public void callGET(){
		System.out.println("[callGET]");
		try { 
			// 인스턴스 생성
			OkHttpClient client = new OkHttpClient();
			// URL
			String strURL = "https://dummy.restapiexample.com/api/v1/employees";
			// GET요청을 위한 build 작업.
			Request.Builder builder = new Request.Builder().url(strURL).get();
			// json을 주고받는 경우, 헤더에 추가.
			builder.addHeader("Content-type", "application/json");
			// request 객체 생성.
			Request request = builder.build();
			// request를 요청하고 그 결과를 response 객체로 응답 받음.
			Response response = client.newCall(request).execute();
			// 응답처리
			if (response.isSuccessful()) {
				String responseString = null;
				ResponseBody body = response.body();
				responseString = body.string();
				System.out.println("[callGET responseBody]:" + responseString);
				body.close();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	// post TEST
	public void callPOST() {
		System.out.println("[callPOST]");
		try {
			// 인스턴스를 생성.
			OkHttpClient client = new OkHttpClient();
			// URL
			String strURL = "https://dummy.restapiexample.com/api/v1/create";
			// parameter를 JSON object로 전달
			String strBody = "{\"name\":\"test\",\"salary\":\"123\",\"age\":\"23\"}";

			// POST요청을 위한 request body를 구성.
			RequestBody requestBody = RequestBody.Companion.create(strBody, MediaType.get("application/json; charset=utf-8"));
			
			// POST요청을 위한 build작업
			Request.Builder builder = new Request.Builder().url(strURL).post(requestBody);
			// json을 주고받는 경우, 헤더에 추가
			builder.addHeader("Content-type", "application/json");
			// request 객체를 생성
			Request request = builder.build();
			// request를 요청하고 그 결과를 response 객체로 응답을 받음.
			Response response = client.newCall(request).execute();
			// 응답처리
			if (response.isSuccessful()) {
				String responseString = null;
				ResponseBody body = response.body();
				responseString = body.string();
				System.out.println("[callPOST responseBody]:" + responseString);
				body.close();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

OkHttpAsyncSample.java (비동기)

package com.example.demo;

import java.io.IOException;

import org.springframework.stereotype.Service;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import okhttp3.ResponseBody;

@Service
public class OkHttpAsyncSample {
	
	// get 비동기 TEST
	public void callAsyncGET(){
		
		System.out.println("[callAsyncGET]");
		
		try { 
			// 인스턴스 생성.
			OkHttpClient client = new OkHttpClient();
			// URL
			String strURL = "https://dummy.restapiexample.com/api/v1/employees";
			// GET요청을 위한 build 작업.
			Request.Builder builder = new Request.Builder().url(strURL).get();
			// json을 주고받는 경우, 헤더에 추가.
			builder.addHeader("Content-type", "application/json");
			// request 객체를 생성합니다.
			Request request = builder.build();
			
			// 비동기 처리
			client.newCall(request).enqueue(new Callback() {
				@Override
				public void onFailure(Call call, IOException e) {
					System.out.println("[callAsyncGET responseBody]:" + "onFailure");
					
				}
				@Override
				public void onResponse(Call call, Response response) throws IOException {
					// 응답처리
					if (response.isSuccessful()) {
						String responseString = null;
						ResponseBody body = response.body();
						responseString = body.string();
						System.out.println("[callAsyncGET responseBody]:" + responseString);
						body.close();
					}
				}
			});
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	// post 비동기 TEST
	public void callAsyncPOST() {
		System.out.println("[callAsyncPOST]");
		try {
			// 인스턴스 생성.
			OkHttpClient client = new OkHttpClient();
			// URL
			String strURL = "https://dummy.restapiexample.com/api/v1/create";
			// parameter를 JSON object로 전달
			String strBody = "{\"name\":\"test\",\"salary\":\"123\",\"age\":\"23\"}";
			
			// POST요청을 위한 request body를 구성.
			RequestBody requestBody = RequestBody.Companion.create(strBody, MediaType.get("application/json; charset=utf-8"));
			
			// POST요청을 위한 build작업
			Request.Builder builder = new Request.Builder().url(strURL).post(requestBody);
			// json을 주고받는 경우, 헤더에 추가
			builder.addHeader("Content-type", "application/json");
			// request 객체를 생성
			Request request = builder.build();
			
			// 비동기 처리
			client.newCall(request).enqueue(new Callback() {
				@Override
				public void onFailure(Call call, IOException e) {
					System.out.println("[callAsyncPOST responseBody]:" + "onFailure");
					
				}
				@Override
				public void onResponse(Call call, Response response) throws IOException {
					// 응답처리
					if (response.isSuccessful()) {
						String responseString = null;
						ResponseBody body = response.body();
						responseString = body.string();
						System.out.println("[callAsyncPOST responseBody]:" + responseString);
						body.close();
					}
				}
			});
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

DemoApplication.java (@SpringBootApplication)

 

package com.example.demo;

import java.io.File;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication implements CommandLineRunner{
	
	@Autowired
	private OkHttpSample okHttpSample;
	
	@Autowired
	private OkHttpAsyncSample okHttpAsyncSample;
 
	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
	}
	
	@Override
	public void run(String... args) throws Exception {
		okHttpsTest();
	}
	
	public void okHttpsTest() {
		okHttpSample.callGET();
		okHttpSample.callPOST();
		okHttpAsyncSample.callAsyncGET();
		okHttpAsyncSample.callAsyncPOST();
	}
}

TEST 결과

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v2.7.1)

2022-07-11 14:33:04.901  INFO 20320 --- [           main] com.example.demo.DemoApplication         : Starting DemoApplication using Java 1.8.0_171 on DESKTOP-97G1J5G with PID 20320 (D:\workspace_springboot\sampleCodeCommit\target\classes started by pilseong in D:\workspace_springboot\sampleCodeCommit)
2022-07-11 14:33:04.905  INFO 20320 --- [           main] com.example.demo.DemoApplication         : No active profile set, falling back to 1 default profile: "default"
2022-07-11 14:33:06.889  INFO 20320 --- [           main] com.example.demo.DemoApplication         : Started DemoApplication in 2.432 seconds (JVM running for 4.291)
[callGET]
[callGET responseBody]:{"status":"success","data":[{"id":1,"employee_name":"Tiger Nixon","employee_salary":320800,"employee_age":61,"profile_image":""},{"id":2,"employee_name":"Garrett Winters","employee_salary":170750,"employee_age":63,"profile_image":""},{"id":3,"employee_name":"Ashton Cox","employee_salary":86000,"employee_age":66,"profile_image":""},{"id":4,"employee_name":"Cedric Kelly","employee_salary":433060,"employee_age":22,"profile_image":""},{"id":5,"employee_name":"Airi Satou","employee_salary":162700,"employee_age":33,"profile_image":""},{"id":6,"employee_name":"Brielle Williamson","employee_salary":372000,"employee_age":61,"profile_image":""},{"id":7,"employee_name":"Herrod Chandler","employee_salary":137500,"employee_age":59,"profile_image":""},{"id":8,"employee_name":"Rhona Davidson","employee_salary":327900,"employee_age":55,"profile_image":""},{"id":9,"employee_name":"Colleen Hurst","employee_salary":205500,"employee_age":39,"profile_image":""},{"id":10,"employee_name":"Sonya Frost","employee_salary":103600,"employee_age":23,"profile_image":""},{"id":11,"employee_name":"Jena Gaines","employee_salary":90560,"employee_age":30,"profile_image":""},{"id":12,"employee_name":"Quinn Flynn","employee_salary":342000,"employee_age":22,"profile_image":""},{"id":13,"employee_name":"Charde Marshall","employee_salary":470600,"employee_age":36,"profile_image":""},{"id":14,"employee_name":"Haley Kennedy","employee_salary":313500,"employee_age":43,"profile_image":""},{"id":15,"employee_name":"Tatyana Fitzpatrick","employee_salary":385750,"employee_age":19,"profile_image":""},{"id":16,"employee_name":"Michael Silva","employee_salary":198500,"employee_age":66,"profile_image":""},{"id":17,"employee_name":"Paul Byrd","employee_salary":725000,"employee_age":64,"profile_image":""},{"id":18,"employee_name":"Gloria Little","employee_salary":237500,"employee_age":59,"profile_image":""},{"id":19,"employee_name":"Bradley Greer","employee_salary":132000,"employee_age":41,"profile_image":""},{"id":20,"employee_name":"Dai Rios","employee_salary":217500,"employee_age":35,"profile_image":""},{"id":21,"employee_name":"Jenette Caldwell","employee_salary":345000,"employee_age":30,"profile_image":""},{"id":22,"employee_name":"Yuri Berry","employee_salary":675000,"employee_age":40,"profile_image":""},{"id":23,"employee_name":"Caesar Vance","employee_salary":106450,"employee_age":21,"profile_image":""},{"id":24,"employee_name":"Doris Wilder","employee_salary":85600,"employee_age":23,"profile_image":""}],"message":"Successfully! All records has been fetched."}
[callPOST]
[callPOST responseBody]:{"status":"success","data":{"name":"test","salary":"123","age":"23","id":1236},"message":"Successfully! Record has been added."}
[callAsyncGET]
[callAsyncPOST]
[callAsyncGET responseBody]:{"status":"success","data":[{"id":1,"employee_name":"Tiger Nixon","employee_salary":320800,"employee_age":61,"profile_image":""},{"id":2,"employee_name":"Garrett Winters","employee_salary":170750,"employee_age":63,"profile_image":""},{"id":3,"employee_name":"Ashton Cox","employee_salary":86000,"employee_age":66,"profile_image":""},{"id":4,"employee_name":"Cedric Kelly","employee_salary":433060,"employee_age":22,"profile_image":""},{"id":5,"employee_name":"Airi Satou","employee_salary":162700,"employee_age":33,"profile_image":""},{"id":6,"employee_name":"Brielle Williamson","employee_salary":372000,"employee_age":61,"profile_image":""},{"id":7,"employee_name":"Herrod Chandler","employee_salary":137500,"employee_age":59,"profile_image":""},{"id":8,"employee_name":"Rhona Davidson","employee_salary":327900,"employee_age":55,"profile_image":""},{"id":9,"employee_name":"Colleen Hurst","employee_salary":205500,"employee_age":39,"profile_image":""},{"id":10,"employee_name":"Sonya Frost","employee_salary":103600,"employee_age":23,"profile_image":""},{"id":11,"employee_name":"Jena Gaines","employee_salary":90560,"employee_age":30,"profile_image":""},{"id":12,"employee_name":"Quinn Flynn","employee_salary":342000,"employee_age":22,"profile_image":""},{"id":13,"employee_name":"Charde Marshall","employee_salary":470600,"employee_age":36,"profile_image":""},{"id":14,"employee_name":"Haley Kennedy","employee_salary":313500,"employee_age":43,"profile_image":""},{"id":15,"employee_name":"Tatyana Fitzpatrick","employee_salary":385750,"employee_age":19,"profile_image":""},{"id":16,"employee_name":"Michael Silva","employee_salary":198500,"employee_age":66,"profile_image":""},{"id":17,"employee_name":"Paul Byrd","employee_salary":725000,"employee_age":64,"profile_image":""},{"id":18,"employee_name":"Gloria Little","employee_salary":237500,"employee_age":59,"profile_image":""},{"id":19,"employee_name":"Bradley Greer","employee_salary":132000,"employee_age":41,"profile_image":""},{"id":20,"employee_name":"Dai Rios","employee_salary":217500,"employee_age":35,"profile_image":""},{"id":21,"employee_name":"Jenette Caldwell","employee_salary":345000,"employee_age":30,"profile_image":""},{"id":22,"employee_name":"Yuri Berry","employee_salary":675000,"employee_age":40,"profile_image":""},{"id":23,"employee_name":"Caesar Vance","employee_salary":106450,"employee_age":21,"profile_image":""},{"id":24,"employee_name":"Doris Wilder","employee_salary":85600,"employee_age":23,"profile_image":""}],"message":"Successfully! All records has been fetched."}
[callAsyncPOST responseBody]:{"status":"success","data":{"name":"test","salary":"123","age":"23","id":4708},"message":"Successfully! Record has been added."}

[참고]

OkHttp 를 이용한 REST Client 구현 예제