생각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이 성숙하기에는 아직 시간이 걸릴것 같다고 느꼈습니다.
저작자 표시 비영리 변경 금지
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 프로토콜 로직 처리를 안해도 되기 때문에 빠르게 개발가능합니다.

저작자 표시 비영리 변경 금지
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)

참고해주세요.

저작자 표시 비영리 변경 금지
Posted by 꿍스