프로그램 언어/Java
Java HttpClient 예제 (curl명령어 Java 변환)
husks
2023. 2. 7. 11:30
반응형
두레이 (https://dooray.com/main/) 라는 협업 툴이 있습니다.
해당 툴을 사용해서 회원에게 메시지를 보내는 API 연동을 개발 하였습니다.
API문서는 아래와 같습니다.
Dooray-가이드
helpdesk.dooray.com
그중 "메신저 1:1 메시지 전송 API" 을 참고하였습니다.
curl -H 'Authorization: dooray-api {TOKEN}' -H 'Content-Type: application/json' -d '{"text":"Hello World","organizationMemberId":"{ORGANIZATION_MEMBER_ID}"}' https://api.dooray.com/messenger/v1/channels/direct-send
curl로 테스트 하도록 되어 있는 부분을 Java의 HttpClient로 구현해 보았습니다.
하지만 굳이 Dooray 가 아니더라도 curl을 HttpClient로 구현하고 싶은분은 해당 소스를 확인하시면 됩니다.
일단 HttpClient 관련 jar를 다운받거나 maven에 라이브러리 추가 해줘야 합니다.
해당 jar파일 입니다. 다운로드 받으세요.
commons-codec-1.10.jar
0.27MB
commons-logging-1.1.3.jar
0.06MB
httpclient-4.5.13.jar
0.74MB
httpcore-4.4.9.jar
0.31MB
이메일을 조건으로 아이디를 조회합니다.
아이디로 메시지를 보낼수 있기 때문입니다.
get방식으로 아이디를 조회하고 post방식으로 메시지를 보냅니다.
소스를 참고 하시고 필요한 부분은 주석을 달았습니다.
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.json.simple.parser.JSONParser;
import org.springframework.util.StringUtils;
public class CallUrl {
public static void main(String[] args) {
String id = "id"; //아이디
String pw = "pw"; //패스워드
String certification = id+":"+pw; //두레이 발급코드를 자세히 보면 : 구분자로 아이디 패스워드가 붙어있음
//필요하다면 Base64로 인코딩, 해당 API에서 인코딩 하면 에러가 발생하여 생략
//String encodedValue = Base64.encodeBase64String(certification.getBytes());
//아이디 검색을 위한 URL
String getInfoUrl = "https://api.dooray.com/common/v1/members?externalEmailAddresses=";
String searchInfo = "test@test.co.kr";
//메시지를 보내기 위한 URL
String sendMessageUrl = "https://api.dooray.com/messenger/v1/channels/direct-send";
String text = "Hello World 한글테스트";
String organizationMemberId = "";
try {
getInfoUrl = getInfoUrl+searchInfo; //메시지 전송을 위해 회원 아이디를 이메일로 검색 하는 URL
HttpGet httpGet = new HttpGet(getInfoUrl); //조회는 get방식
String authorization = "dooray-api "+certification; //dooray-api 대신 기본 인증이면 Base 사용
httpGet.setHeader("Authorization", authorization); //인증
httpGet.setHeader("Content-Type", "application/json"); //Content-Type 설정
CloseableHttpClient httpClient = HttpClientBuilder.create().build();
CloseableHttpResponse response = httpClient.execute(httpGet);
//HTTP 상태 코드
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode == 200) {
ResponseHandler<String> handler = new BasicResponseHandler();
String responseBody = handler.handleResponse(response);
System.out.println(responseBody); //응답
JSONParser jsonParser = new JSONParser();
//응답받아서 json파서로 아이디 추출
org.json.simple.JSONObject jsonObj = (org.json.simple.JSONObject) jsonParser.parse(responseBody);
org.json.simple.JSONArray resultArray = (org.json.simple.JSONArray) jsonObj.get("result");
for (int i = 0; i < resultArray.size(); i++) {
org.json.simple.JSONObject resultObject = (org.json.simple.JSONObject) resultArray.get(i);
organizationMemberId = (String) resultObject.get("id"); //아이디 추출
}
if(!StringUtils.isEmpty(organizationMemberId)) { //아이디가 널이 아니면
HttpPost httpPost = new HttpPost(sendMessageUrl); //메시지는 post방식
httpPost.setHeader("Authorization", authorization); //인증
httpPost.setHeader("Content-Type", "application/json"); //Content-Type 설정
String entity = "{\"text\":\""+text+"\",\"organizationMemberId\":\""+organizationMemberId+"\"}"; //entity값 설정 문자, 아이디
httpPost.setEntity(new StringEntity(entity, "UTF-8")); //한글깨짐 방지 UTF-8
httpClient = HttpClientBuilder.create().build();
response = httpClient.execute(httpPost);
//HTTP 상태 코드
statusCode = response.getStatusLine().getStatusCode();
if (statusCode == 200) { //성공
handler = new BasicResponseHandler();
responseBody = handler.handleResponse(response);
}else {
System.out.println("statusCode ==> "+statusCode);
}
}
System.out.println(responseBody);
}else {
System.out.println("statusCode ==> "+statusCode);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
반응형