개발

국가법령정보 API 사용 방법

뽀글뽀글 개발자 2024. 9. 27. 11:38

API 신청

API를 요청할 서버 IP와 도메인을 등록하고, 원하는 API를 체크하면 끝이다.

 

법제처 API 활용가이드

 

국가법령정보 공동활용

※ 체계도 등 부가서비스는 법령서비스 신청을 하면 추가신청 없이 이용가능합니다.

open.law.go.kr

 

 

Javascript 구현 코드

const LAW_API_BASE_URL = "https://www.law.go.kr";

/**
 * 법제처 API 요청 파라미터 클래스
 * 생성자에서 필수 파라미터를 생성하고, addField 메소드로 필요한 파라미터를 추가
 */
class LawApiParams {
  constructor(target, type = "XML") {
    this.OC = "API 신청한 이메일의 아이디 부분"; //ex) abc123@email.com => abc123
    this.type = type; //XML or HTML
    this.target = target; //API 종류
  }

  addField(key, value) {
    this[key] = value;
    return this;
  }
}

/**
 * 법제처 API 요청
 * @link https://open.law.go.kr/LSO/openApi/guideList.do
 *
 * @Param {string} urlPath API URL Path
 * @param {LawApiParams} lawApiParams 법제처 API 요청 파라미터
 * @returns JSON or HTML
 * */
async function lawApiCall(urlPath, lawApiParams) {
  try {
    const response = await $.ajax({
      url: LAW_API_BASE_URL + urlPath,
      method: "GET",
      data: lawApiParams,
    });
    return lawApiParams.type === "XML" ? xmlToJson(response) : response;
  } catch (error) {
    console.error("Error:", error);
    throw error;
  }
}

/**
 * XML을 JSON으로 변환
 *
 * @param  xml
 * @returns json
 */
function xmlToJson(xml) {
  let obj = {};

  if (xml.nodeType == 1) {
    if (xml.attributes.length > 0) {
      obj["@attributes"] = {};
      for (let j = 0; j < xml.attributes.length; j++) {
        let attribute = xml.attributes.item(j);
        obj["@attributes"][attribute.nodeName] = attribute.nodeValue;
      }
    }
  } else if (xml.nodeType == 3) {
    obj = xml.nodeValue;
  } else if (xml.nodeType == 4) {
    obj = xml.nodeValue;
  }

  let textNodes = [].slice.call(xml.childNodes).filter(function (node) {
    return node.nodeType === 3;
  });
  if (xml.hasChildNodes() && xml.childNodes.length === textNodes.length) {
    obj = [].slice.call(xml.childNodes).reduce(function (text, node) {
      return text + node.nodeValue;
    }, "");
  } else if (xml.hasChildNodes()) {
    for (let i = 0; i < xml.childNodes.length; i++) {
      let item = xml.childNodes.item(i);
      let nodeName = item.nodeName;
      if (typeof obj[nodeName] == "undefined") {
        obj[nodeName] = xmlToJson(item);
      } else {
        if (typeof obj[nodeName].push == "undefined") {
          let old = obj[nodeName];
          obj[nodeName] = [];
          obj[nodeName].push(old);
        }
        obj[nodeName].push(xmlToJson(item));
      }
    }
  }
  return obj;
}