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 구현 예제