생각2009/08/17 23:43
오늘 2009년 매쉬업 경진대회에 출전했던 도서나눔 사이트 ggats.com을 유지보수 하던 중 도서검색 결과가 DB에 저장될때 오류가 발생하여 오류를 찾다보니 네이버 도서검색 API(http://dev.naver.com/openapi/apis/data/book)의 아웃풋이 바뀐 걸 알았습니다.

이전에는 bid(네이버 도서에서의 책ID 즉 book.naver.com 의 키 인듯 합니다.) 를 노출하여 예를 들어 '소설 손자병법'의 예전 link 아웃풋은 http://book.naver.com/bookdb/book_detail.php?bid=117701 였지만, 어느세

http://openapi.naver.com/l?AAAC3MSw6DIBgE4NP8LIk8LLJgoVav0UihgfQBJWji7VVCMosvk8zkPVqlQ3ij1RvFRUsZ+q827QqmEbobdGMBh57XRjYX5FQwwMBAkgIKskUu2ZdyOUdgPdD5zPWOf8tmE36Gby2MrngYmxf/wdGdi1l7A+xOiBANOQBWP/V3mwAAAA==

라는 얄궃은 값을 보내주어 bid 값을 유추할 수 없도록 만들었습니다.

유저들보고 OpenAPI를 적극적으로 사용하여 어플리케이션을 개발하라고 유도했지만 어느새 어떠한 통보도 없이 OpenAPI의 아웃풋을 변경했습니다. 아무래도 bid값을 link 아웃풋에 노출시키는 것이 부담이 되었던 것 같습니다.

최근 네이버 데스크톱 단순 통보로 서비스를 중단하는 것을 보며 '네이버' 같은 기업의 Open Platform이 성숙하기에는 아직 시간이 걸릴것 같다고 느꼈습니다.
저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 꿍스
삽질2009/08/07 15:29

AJAX 비동기 처리를 위한 IXMLHTTPRequest, COM 인터페이스의 하나이기 때문에 웹 브라우저 안에서 뿐 아니라 윈도우즈어플리케이션으로도 구현이 가능합니다.

더욱이 IXMLHTTPRequest는 Windows CE기반의 Windows Mobile에서도 구현이 되어있을 뿐 아니라, IXMLDOMDocument와 같은 XML DOM 인터페이스와도 바로 연결이 가능하므로 윈도우즈 어플리케이션에서 복잡한 Socket처리나, WinInet라이브러리를 별도로 사용하지 않아도 쉽게 웹의 OpenAPI를 사용할 수 있습니다. ( 내부적으로는 WinInet, Socket을 사용합니다. )

http://msdn.microsoft.com/en-us/library/aa924919.aspx : IXMLHTTPRequest 인터페이스 설명

웹의 AJAX와 같이 동기, 비동기 방식을 모두사용 가능할 뿐만아니라 모든 메소드를 제공하고 IStream 방식으로 받아 아래의 포스팅과 같이 파일로 저장할 수도있습니다.

CComQIPtr pDispatch;
CComPtr pXMLHTTP;
CComPtr pXMLDoc;
		
const CComVariant VAL_NULL = NULL;
const CComVariant VAL_FALSE = FALSE;
long length_posts = 0;
CComBSTR bstr;
HRESULT hr;
		
pXMLHTTP.CoCreateInstance(CLSID_XMLHTTP);
		
pXMLHTTP->open(CComBSTR("GET"), CComBSTR("http://me2day.net/api/get_posts/ggungs"), VAL_FALSE , VAL_NULL , VAL_NULL);
hr = pXMLHTTP->send(VAL_NULL);
if(hr != S_OK) {
	//MessageBox(L"전송실패");
	return;
}
			
hr = pXMLHTTP->get_responseXML(&pDispatch);
if(hr == E_PENDING) {
	//MessageBox(L"PENDING");
	return;
}
		
pDispatch->QueryInterface(IID_IXMLDOMDocument, (void **)&pXMLDoc);
pDispatch.Release();

if(pNodeList) { pNodeList.Release(); }
pXMLDoc->selectNodes(L"/posts/post", &pNodeList);
pNodeList->get_length(&length_posts);
		
 ..... // XML 처리
		
pXMLDoc.Release();
pXMLHTTP.Release();

 

위의 예는 동기 방식으로 미투데이 OpenAPI에 접속하여 XML 데이터를 가져와서 XML 파싱하는 예입니다.

물론 AJAX의 꽃인 비동기 처리로 onreadystatechange에 자바스크립트처럼 함수가 호출되도록 할 수 있지만 VC++ 에서는 좀 복잡하게 처리해야 할듯 합니다.
(http://www.ookii.org/post/using_ixmlhttprequestonreadystatechange_from_c.aspx 참고)

IXMLHTTPRequest 인터페이스를 잘 사용하면 HTTP 프로토콜 로직 처리를 안해도 되기 때문에 빠르게 개발가능합니다.

저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 꿍스
삽질2009/08/04 00:24

SHCreateStreamOnFile 함수로 지정된 파일에 대한 IStream 인터페이스를 얻은 다음 CopyTo 메소드로 스트림을 복사합니다. (http://msdn.microsoft.com/en-us/library/bb759864(VS.85).aspx)

	pStreamSrc = ........

	STATSTG StatInfo;
	CComPtr pStreamDest;
	hr = SHCreateStreamOnFile(L"C:\\profile.png", STGM_WRITE | STGM_CREATE, &pStreamDest) ;
	pStream->Stat(&StatInfo, STATFLAG_NONAME );
	pStream->CopyTo(pStreamDest, StatInfo.cbSize, NULL, NULL);
	pStreamDest->Commit(0);

Windows Mobile 에서는 SHCreateStreamOnFile 함수가 없어서 직접 구현해야 합니다.

http://www.pocketpcdn.com/articles/articles.php?&atb.set(a_id)=6211&atb.set(c_id)=57&atb.perform(details)

참고해주세요.

저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 꿍스