Friday, July 4, 2014

네이버 오픈 API 검색 API 버그?

검색 결과까지는 잘 뜨는데, 반환된 XML 속의 링크를 클릭했을 때 나오는 URL이 틀려 있다.

ListView에 XML을 변환해 표시하는 코드. 이건 잘 동작한다.
ListViewItem.SubItems에서 [0]=제목, [1]=설명, [2]=URL이다.

        const string key = "x97y9zxc8v9as8fsa8f";   // 발급받은 키
        int start = 1; // 시작 번호
        int display = 10; // 페이지 당 보일 게시물 수

            string query = this.textBox1.Text;
            string target = "webkr";
            var doc = new XmlDocument();

            var url = string.Format(
                "http://openapi.naver.com/search?key={0}&query={1}&target={2}&start={3}&display={4}",
                key, query, target, start, display);
            doc.Load(url);
         
            var rss = doc.SelectSingleNode("rss");
            string[] ret = new string[3];
            var channel = rss.SelectSingleNode("channel");
foreach (XmlNode item in channel.SelectNodes("item"))
{
string[] result = new string[3];
result[0] = item.SelectSingleNode("title").InnerText;
result[1] = item.SelectSingleNode("description").InnerText;
result[2] = item.SelectSingleNode("link").InnerText;

this.listView1.Items.Add(new ListViewItem(result)


// 이건 기본 브라우저로 링크를 여는 코드.
// 실행은 잘 되는데 URL이 틀려 있다.

private void listView1_DoubleClick(object sender, EventArgs e)
{
if (listView1.SelectedItems.Count > 0)
{
foreach (ListViewItem sel in listView1.SelectedItems)
{
var x = sel.SubItems[2].Text; //정상
Process.Start(x); //여기서 리디렉션 되면서 안 된다.
}
}
}


네이버 open API 검색은 실제 주소가 아니라 그 주소로 redirection하는 링크(위 코드에서 'x')를 받아오는데, Process.Start()가 잘 돼더라도, redirection 주소가 틀렸으면 브라우저가 404 에러를 내게 된다.

어이없게도 http 뒤에 :(콜론)이 빠져 있다. 즉
http://www.naver.com 이게
http//www.naver.com으로 되는 것이다.

내가 잘못 짠 게 아니니 어찌 할 방법이 없다.

오픈 API 나온 지도 오래 됐는데 왜 이런 건지 모르겠다.


'지식인' 검색을 하면 잘 되는 걸 봐서, 이건 그냥 오타에 의한 게 분명하다.
즉 위 코드에서 검색 대상을 웹(webkr)이 아니라 지식인(kin)으로 고치면 잘 동작한다.
string target = "kin";



공식 카페 가서

물어볼랬더니 가입 후 댓글을 5개 달고, 3번 접속해야 질문을 올릴 수 있다.

접속 횟수가 모자라 못 쓰는 중...


뭐 질문해 봤자 답변 안 올라올 거 같기도 하다.

그냥 구글 API 써야지.

No comments:

Post a Comment

창 핸들을 만드는 동안 오류가 발생했습니다

System.ComponentModel.Win32Exception was unhandled   MyForm w = new MyForm IntPtr handle = wnd.Handle;   // Exception occurs here class MyFo...