프로그래밍/백엔드

외부 API 호출 정리(GET, POST 방식)(feat. JWT토큰 활용)

제로스크랩 2023. 4. 5. 11:09

코딩을 업으로 삼은지 6년차가 되었다.

 

최근 이직을 해보니 그동안 공부를 너무 설렁설렁해왔다는 것을 인지하게 되었다.

이론만 숙지하고 실제로 행동하지 못한 것들이 상당히 많았다.

 

교육생시절 웹 크롤링을 통해 URL호출을 해보기는 했었으나 정리를 해놓지 않아서 완전히 잊혀진 상태였고

SM(시스템 유지보수)일만 4년을 하다보니 API연동을 직접 해볼 기회가 없었다.

그래서 이론만 숙지하고 있었는데 이직한 회사에서 ZOOM API를 직접 연동하게되었다.

 

그리하여 최초로 코드정리를 하게 되었다.

대략적인 흐름만 기억하고 있어도 될듯 하다.

  1. HttpURLConnection: URL호출
  2. OutputStream : form 데이터 넘겨주기(POST방식 사용시)
  3. responseCode : 결과코드확인(200이면 성공)
  4. InputStreamReader : 서버로부터 데이터 읽어오기

 

package uiyouth.front.controller;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.json.simple.JSONArray;

@Controller
@RequestMapping(value = "/zoom")
public class ZoomController {
	private static final String AUTHORIZATION = "bearer [YOUR AUTHORIZATION]";
	//CALL GET API
	@RequestMapping(value = "/index.ui")
	public @ResponseBody HashMap<String, Object> index(
			HttpServletRequest request,
			HttpServletResponse response,
			HttpSession session,
			Model model
			) throws ParseException {
		String reqURL = "[YOUR URL]";
		HashMap<String, Object> resultMap = new HashMap<String, Object>();
		
		try {
			URL url = new URL(reqURL);
	
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
			// POST 요청을 위해 기본값이 false인 setDoOutput을 true로
	
			conn.setRequestMethod("GET");
			conn.setRequestProperty("Authorization", AUTHORIZATION);
	
			// 결과 코드가 200이라면 성공
			int responseCode = conn.getResponseCode();
			System.out.println("### getAccessToken responseCode : " + responseCode);
			
			// 서버로부터 데이터 읽어오기
			BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
			StringBuilder sb = new StringBuilder();
			String line = "";

			while ((line = br.readLine()) != null) {
				sb.append(line);
			}
			System.out.println("### response body : " + sb);
			
			// JSON String -> Map
			JSONParser parser = new JSONParser();
			JSONObject jsonObject =  (JSONObject) parser.parse(sb.toString());
			JSONArray jsonArray = (JSONArray) jsonObject.get("users");
			
			for (int i = 0; i < jsonArray.size(); i++) {
				JSONObject innerJsonObject =  (JSONObject) jsonArray.get(i);
                //CALL POST API
				String startUrl = createMeeting((String) innerJsonObject.get("id"));
				resultMap.put("startUrl", startUrl);
			}
			
			br.close();
			conn.disconnect();
			
		} catch (IOException e) {
			e.printStackTrace();
		}
		return resultMap;
	}
    
	//CALL POST API
	private String createMeeting(	String userId) throws ParseException {
		String reqURL = "[YOUR URL]";
		String returnUrl = "";
		
		try {
			URL url = new URL(reqURL);
			
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
			conn.setRequestMethod("POST");
			// POST 요청을 위해 기본값이 false인 setDoOutput을 true로
			conn.setDoOutput(true);
			conn.setRequestProperty("Authorization", AUTHORIZATION);
			conn.setRequestProperty("Content-Type", "application/json");
			conn.setRequestProperty("Accept-Charset", "UTF-8"); 
			
			OutputStream os = conn.getOutputStream();
			os.write("[YOUR JSON]".getBytes("UTF-8")); /* EX: "{\"agenda\" : \"my meeting\"}" */
			os.flush();
			
			// 결과 코드가 200이라면 성공
			int responseCode = conn.getResponseCode();
			System.out.println("### getAccessToken responseCode : " + responseCode);
	
			// 서버로부터 데이터 읽어오기
			BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
			StringBuilder sb = new StringBuilder();
			String line = "";
			
			while ((line = br.readLine()) != null) {
				sb.append(line);
			}
			System.out.println("### response body : " + sb);
			
			JSONParser parser = new JSONParser();
			JSONObject jsonObject =  (JSONObject) parser.parse(sb.toString());
			returnUrl =  (String) jsonObject.get("start_url");
			
			br.close();
			conn.disconnect();
			
		} catch (IOException e) {
			e.printStackTrace();
		}
		return returnUrl;
	}
}
728x90
반응형