테스트 사이트 - 개발 중인 베타 버전입니다

공공데이터 api 검색 기능 채택완료

비유비 2년 전 조회 2,159

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

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

댓글을 작성하려면 로그인이 필요합니다.

답변 3개

채택된 답변
+20 포인트

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

 

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

 

요청 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 서비스 제공 업체에 문의해서 해결방법을 찾으시는 것도 좋은 방법일 거라 생각합니다

로그인 후 평가할 수 있습니다

답변에 대한 댓글 1개

비유비
2년 전
검색어 문제였네요 감사합니다!

댓글을 작성하려면 로그인이 필요합니다.

비유비
2년 전

 

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 코드입니다

로그인 후 평가할 수 있습니다

댓글을 작성하려면 로그인이 필요합니다.

2년 전

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

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

로그인 후 평가할 수 있습니다

답변에 대한 댓글 1개

비유비
2년 전
답변으로 달았습니다! 여기서 어떤 게 문제인지 모르겠습니다..

댓글을 작성하려면 로그인이 필요합니다.

답변을 작성하려면 로그인이 필요합니다.

로그인