Blogger에서 재귀함수를 통해 전체 글 리스트 얻어오기(for Archive page , JSONP API)
어제 밤부터 급 삘받아서 Archive 페이지를 만들었습니다. https://www.hahwul.com/p/blog-archive.html
보통 게시글 리스트는 Pagination 되어 한번에 지정된 갯수의 결과만큼만 확인할 수 있게 구성합니다. 저 또한 제 블로그 메인 페이지나 검색쪽은 동일하게 적용되어 있습니다. 그러나 가끔은 페이지의 전체 리스트가 보고싶은 경우가 있습니다.
오늘은 blogger의 JSONP API를 이용해 전체 게시글 리스트를 가져오고 이를 이용해서 Archive 를 만들어봅시다.
feeds를 이용하여 전체 글 목록 가져오기
blogger의 JSONP API 중 /feeds/posts/summary
를 이용하면 게시글 리스트를 가져올 수 있습니다. 보통 메인 페이지의 글 리스트의 구현 코드는 이 방식을 이용합니다.
https://www.hahwul.com/feeds/posts/summary?alt=json-in-script&callback=zzzz
다만 한번에 피드에서 받아올 수 있는 크기가 정해져있어(500개던가요..) 글 갯수가 그 이상이 경우 한번의 요청으로 모든 글을 가져올 수 없습니다. 그래서 전체 피드를 나눠서 받아와야하며, 이는 재귀함수를 통해 쉽게 구현할 수 있습니다.
docdoc = []
function sendQuery()
{
var scpt = document.createElement("script");
scpt.src = "/feeds/posts/summary?alt=json&callback=processPostList&start-index=" + startIndex + "&max-results=" + maxResults;
document.body.appendChild(scpt);
}
function processPostList(root)
{
var feed = root.feed;
if (feed.entry.length > 0)
{
for (var i = 0; i < feed.entry.length; i++)
{
var entry = feed.entry[i];
var title = entry.title.$t;
for (var j = 0; j < entry.link.length; j++)
{
if (entry.link[j].rel == "alternate")
{
var url = entry.link[j].href;
if (url && url.length > 0 && title && title.length > 0)
{
// entry (각 객체)
// title (게시글 제목)
// .link (링크)
// .published (발행일)
tmp = Date.parse(entry.published.$t)
date = new Date(tmp)
year = date.getFullYear();
if(chartdata[year]){
chartdata[year] = chartdata[year]+1;
}
else{
chartdata[year] = 1;
}
// 저는 이런식으로 docdoc 이라는 Array에 hash 형태로 집어넣었습니다.
docdoc.push({title:title,link:url,updated:date.toLocaleDateString()})
}
break;
}
}
}
if (feed.entry.length >= maxResults)
{
startIndex += maxResults;
sendQuery();
}
}
}
sendQuery();
View 만들기
여기서부턴 제 Archive 페이지와 구성이 조금 달라집니다. (전 VueJS를 사용한 상태라..) 위에서 docdoc이라는 Array를 만들고 Hash로 값을 넣어줬기 때문에 forEach로 뺴면 간단합니다.
docdoc.forEach(function(obj){console.log(obj.title)})
// 제목만 출력
페이지에 li로 찍도록 변경해보면..
c = document.getElementById('canvas');
buf = ""
docdoc.forEach(function(obj){
buf = buf + "<li><a href='"+obj.link+"'>"+obj.title+"</a></li>"
})
c.innerHTML = buf;
잘 됩니다 :)