공공데이터 api 검색 기능

공공데이터 api 검색 기능

QA

공공데이터 api 검색 기능

답변 3

본문

공공데이터 api에 있던 올바른 검색어로 검색했는데 자꾸 nodata error라면서 검색결과가 안 뜨는데 뭐가 문제인걸까요?

api 요청이랑 api 응답 처리는 잘 되고 있는 것 같은데 자꾸 검색어가 없다고 합니다....

이 질문에 댓글 쓰기 :

답변 3

질문하신 내용으로보아 다음과 같이 검토를 해보셔야 할 것 같습니다.

 

서비스 키: 서비스 키를 정확하게 설정했는지 확인. 코드에서는 서비스키라는 문자열로 설정되어 있으며, 실제로는 올바른 서비스 키로 대체해야 함. 

 

요청 URL: API 요청 URL이 올바른지 확인. 현재 코드에서는 http://api.data.go.kr/openapi/tn_pubr_public_trsmic_api로 설정되어 있지만, API 서비스에 따라 요청 URL이 다를 수 있으므로 해당 API의 문서를 확인하여 올바른 URL을 사용하고 있는지 확인.

 

검색어: trsmicNm 매개변수에 올바른 검색어가 설정되어 있는지 확인. 현재 코드에서는 빈 문자열로 설정되어 있으며, 이 경우 검색 결과가 없을 수 있습니다. 검색어를 올바르게 설정하거나, 검색어를 입력하는 UI를 제공하여 사용자가 입력하도록 할 수 있습니다.

 

API 응답 확인: API 응답을 확인하기 위해 console.log(jsonData)를 사용하고 있습니다. 이를 통해 API 응답 내용을 콘솔에서 확인하고 에러 메시지나 빈 응답 등을 파악할 수 있습니다. API 응답이 정상적으로 수신되는지 확인해보세요.

 

네트워크 오류 처리: API 요청 중 네트워크 오류가 발생할 수 있습니다. 네트워크 응답이 실패한 경우에 대한 오류 처리를 추가하여 오류 메시지를 확인하고 디버깅할 수 있도록 합니다.

 

API 서비스 상태 확인: API 서비스가 현재 활성화되어 있는지, 서버 문제가 없는지 확인. 가끔 API 서비스의 문제로 인해 데이터를 검색할 수 없는 경우가 있을 수 있습니다.

 

요청url 클릭시 xml문서가 아래와 같이 출력이 되네요.

<response> <header> <resultCode>99</resultCode>

<resultMsg>class java.lang.NullPointerException</resultMsg> </header>

</response>

 

API응답확인, API 서비스 문서확인, 서비스 키 확인, 오류 처리, 서버상태 확인, 버전 호환성 문제 이러한 부분들을 체크해 보세요. 

또는 API 서비스 제공 업체에 문의해서 해결방법을 찾으시는 것도 좋은 방법일 거라 생각합니다

질문만으로는 어떤 api인지도 어떻게 사용하고 계신지도 몰라서 답변을 받기 힘드실거 같습니다.

좀 더 구체적으로 질문을 하시면 도움을 받으실수 있으실거 같습니다.

thumb-990525898_1696944936.0073_730x835.png

 

var url = 'http://api.data.go.kr/openapi/tn_pubr_public_trsmic_api'; /*URL*/

var queryParams = '?' + encodeURIComponent('serviceKey') + '=' + `서비스키`; /*Service Key*/

queryParams += '&' + encodeURIComponent('pageNo') + '=' + encodeURIComponent('1'); /* */

queryParams += '&' + encodeURIComponent('numOfRows') + '=' + encodeURIComponent('100'); /* */

queryParams += '&' + encodeURIComponent('type') + '=' + encodeURIComponent('xml'); /* */

queryParams += '&' + encodeURIComponent('trsmicNm') + '=' + encodeURIComponent(''); /* */

queryParams += '&' + encodeURIComponent('trsmicLc') + '=' + encodeURIComponent(''); /* */

queryParams += '&' + encodeURIComponent('ctprvnNm') + '=' + encodeURIComponent(''); /* */

const apiUrl = url + queryParams;

// API 요청 보내고 데이터 가져오기

 

//xml->json

function xmlToJson(xml) {

  var obj = {};

 

  if (xml.nodeType == 1) { // element

      if (xml.attributes.length > 0) {

          obj['@attributes'] = {};

          for (var j = 0; j < xml.attributes.length; j++) {

              var attribute = xml.attributes.item(j);

              obj['@attributes'][attribute.nodeName] = attribute.nodeValue;

          }

      }

  } else if (xml.nodeType == 3) { // text

      obj = xml.nodeValue.trim();

  }

 

  var 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.trim();

      }, "");

  } else if (xml.hasChildNodes()) {

      for (var i = 0; i < xml.childNodes.length; i++) {

          var item = xml.childNodes.item(i);

          var nodeName = item.nodeName;

          if (typeof obj[nodeName] == "undefined") {

              obj[nodeName] = xmlToJson(item);

          } else {

              if (typeof obj[nodeName].push == "undefined") {

                  var old = obj[nodeName];

                  obj[nodeName] = [];

                  obj[nodeName].push(old);

              }

              obj[nodeName].push(xmlToJson(item));

          }

      }

  }

  return obj;

}


 

const getXMLfromAPI = async () => {

  try {

      const url = 'http://api.data.go.kr/openapi/tn_pubr_public_trsmic_api';

      const reqURL = `${url}?serviceKey=서비스키;

      const response = await fetch(reqURL);

      const xmlString = await response.text();

      let XmlNode = new DOMParser().parseFromString(xmlString, "text/xml");

      console.log(xmlToJson(XmlNode));

  } catch (error) {

      console.error('오류 발생:', error);

      console.log(xmlToJson(XmlNode));

  }

};

 

// 검색 기능

 

function searchTourismInfo() {

  var searchInput = document.getElementById('sh').value;

  var apiUrl = url + queryParams + '&trsmicNm=' + encodeURIComponent(searchInput);

 

  console.log(apiUrl); // 디버깅 위한 콘솔

 

  fetch(apiUrl)

      .then(response => {

          if (!response.ok) {

              throw new Error('네트워크 응답이 실패했습니다.');

          }

          return response.text(); // XML 형식으로 받기

      })

      .then(xmlString => {

          let XmlNode = new DOMParser().parseFromString(xmlString, "text/xml");

          let jsonData = xmlToJson(XmlNode);

          console.log(jsonData); // 디버깅 위한 콘솔

 

          const apiDataElement = document.getElementById('ntic');

          if (jsonData.response.header.resultCode === "03") {

              apiDataElement.innerHTML = "검색 결과가 없습니다.";

          } else {

              apiDataElement.innerText = JSON.stringify(jsonData, null, 2);

          }

      })

      .catch(error => {

          console.error('API 요청 중 오류 발생:', error);

      });

}

js 코드입니다

답변을 작성하시기 전에 로그인 해주세요.
QA 내용 검색
질문등록
filter #js ×
전체 312
© SIRSOFT
현재 페이지 제일 처음으로