2016년 1월 20일 수요일

apache commons의 httpclient 4.4 사용하여 11번가 연동 개발 간단 정리

1. 11번가에서 제공하는 open API의 java 개발 관련 소스는 좀 틀린 부분이 있다. QA 팀 쪽에 메뉴얼 수정 요청을 했으나..
   아직도 안한다.. 니들 맘대로 해.. 나도 귀찮어..

2. ASP와 JAVA로 둘다 개발해보고 최종적으로 관리나 성능면에서 JAVA를 선택함.

3. ASP는 캐릭터셋을 utf-8로 해야 한다.(메뉴얼에는 euc-kr)


  1. set api = createobject("msxml2.serverXmlhttp")
  2. api.setRequestHeader "content-type","text/xml; charset=utf-8"
  3. api.setRequestHeader "openapikey",openapikey
  4. api.send xmldata


4. JAVA도 당연히 utf-8이다..통신 관련 소스는 이하 정리..

5. 통신 방법에는 Post와 Put이 있다. 메뉴얼 상단의 Method Type : Post (또는 Put) 를 주의깊게 확인하라!

6. 예제 소스는 HttpClient 옛날 버전으로 개발한 듯 하다.. 치사하게 라이브러리를 숨겨서 안알랴줌 해서... 기냥.. 새로 개발함..

7. 사용 라이브러리는 httpclient 4.4 (2015-03-12 현재 최신 버전!!!)

8. 이하 상품등록등에 쓰이는 post 방식 예제 소스(통신부분만 발췌)

클래스의 변수들은 회사 DB쪽에 반영을 위해 필요한 거임.. 통신 부분만 참고하셈..

xml 포맷이야.. 메뉴얼 보고 잘 작성하셈.. 중요한건.. 필수 요소에 대해서 잘 보고 작성 해야 함. 에러가 구체적으로 안나오고.. 그냥 요소가 없다란 식으로 막연하게 나오드라..


  1. public static void sendXmlInfo(String 통신주소, String 전송할XML, String 우리회사상품코드, String 후처리용상태코드) {
  2.         HttpClient httpclient = HttpClients.createDefault();
  3.         try {
  4.             HttpPost httpPost = new HttpPost(통신주소);
  5.             httpPost.addHeader("openapikey", openapikey);
  6.             logger.info("[POST URI] : " + httpPost.getURI());
  7.             //System.out.println("[POST URI] : " + httpPost.getURI());
  8.             System.out.println(전송할XML);
  9.             InputStream in;
  10.             StringEntity entity = new StringEntity(전송할XML,    ContentType.create("text/xml""UTF-8"));
  11.             entity.setChunked(true);
  12.             httpPost.setEntity(entity);
  13.             System.out.println("[Executing request]: " + httpPost.getRequestLine());
  14.             // Export header info --> 디버그 용임...
  15.             Header[] tmp = httpPost.getAllHeaders();
  16.             System.out.println("[Set Header Info]:");
  17.             for (Header header : tmp) {
  18.                 System.out.println(header.toString());
  19.             }
  20.             try {
  21.                 HttpResponse response = httpclient.execute(httpPost);
  22.                 System.out.println(response.toString());
  23.                 in = response.getEntity().getContent();
  24.                 String body = IOUtils.toString(in);
  25.                 //System.out.println(body);
  26.                 uptProdInfo(body, 우리회사상품코드후처리용상태코드);
  27.                 System.out.println("End Proc::::::::::::::::::::::::::::::");
  28.             } catch (ClientProtocolException e) {
  29.                 System.out.println(e);
  30.             } catch (IOException e) {
  31.                 System.out.println(e);
  32.             }
  33.         } finally {
  34.            
  35.         }
  36.     }


9. 이하 상품 수정/판매중지/판매재개 등에 사용되는 put 방식 예제 소스. 변수는 신경쓰지 마셈..

httpclient 이후 HttpPut 생성하는게 포인트.. 그 밖에 다른 것은 없다..


  1. public static void putXmlInfo(String callUrl, String inputXML, String 상품코드, String statusVal) {
  2.         HttpClient httpclient = HttpClients.createDefault();
  3.         try {
  4.             HttpPut httpput = new HttpPut(callUrl);
  5.             httpput.addHeader("openapikey", openapikey);
  6.             logger.info("[PUT URI] : " + httpput.getURI());
  7.             //System.out.println("[POST URI] : " + httpPost.getURI());
  8.             System.out.println(inputXML);
  9.             InputStream in;
  10.             StringEntity entity = new StringEntity(inputXML,    ContentType.create("text/xml""UTF-8"));
  11.             entity.setChunked(true);
  12.             httpput.setEntity(entity);
  13.             System.out.println("[Executing request]: " + httpput.getRequestLine());
  14.             // Export header info
  15.             Header[] tmp = httpput.getAllHeaders();
  16.             System.out.println("[Set Header Info]:");
  17.             for (Header header : tmp) {
  18.                 System.out.println(header.toString());
  19.             }
  20.            
  21.             System.out.println("statusVal::" + statusVal);
  22.            
  23.             try {
  24.                 HttpResponse response = httpclient.execute(httpput);
  25.                 System.out.println(response.toString());
  26.                 in = response.getEntity().getContent();
  27.                 System.out.println(in);
  28.                 String body = IOUtils.toString(in);
  29.                 System.out.println(body);              
  30.                 uptProdInfo(body, prma_pcode, statusVal);
  31.                 System.out.println("End Proc::::::::::::::::::::::::::::::");
  32.             } catch (ClientProtocolException e) {
  33.                 System.out.println(e);
  34.             } catch (IOException e) {
  35.                 System.out.println(e);
  36.             }
  37.         } finally {
  38.            
  39.         }
  40.     }


10. 마지막으로 리턴되는 결과 XML을 parsing 하는 예제.. 뭐 다양하게 개발할 수 있겠지만.. 난 요따구로 했수다..


  1. public static void uptProdInfo(String xmlStr, String 회사상품코드, String statusVal){
  2.         System.out.println("Return XML ::::" + xmlStr);
  3.         InputSource is = new InputSource(new StringReader(xmlStr));
  4.         try {
  5.             Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(is);
  6.             XPath xpath = XPathFactory.newInstance().newXPath();
  7.             NodeList cols = (NodeList)xpath.evaluate("/ClientMessage/resultCode", document, XPathConstants.NODESET);
  8.            
  9.             String resultCode = "";
  10.             for( int idx=0; idx<cols.getLength(); idx++ ){
  11.                 resultCode = cols.item(idx).getTextContent();
  12.             }
  13.            
  14.             if(resultCode.equals("200")){  //정상처리.. 생각해 보니 예외처리 안했다.. 젠장..
  15.                 NodeList cols1 = (NodeList)xpath.evaluate("/ClientMessage/productNo", document, XPathConstants.NODESET);
  16.                 String market_pcode = "";                      
  17.                 for( int idx=0; idx<cols1.getLength(); idx++ ){
  18.                     market_pcode = cols1.item(idx).getTextContent();
  19.                 }
  20.                
  21.                 //여기엔 오픈마켓에서 생성된 상품코드를 DB에 반영하고 DB 상태값을 변경하는게 있었지롱~~
  22.             }
  23.         } catch (SAXException e) {
  24.             // TODO Auto-generated catch block
  25.             e.printStackTrace();
  26.         } catch (IOException e) {
  27.             // TODO Auto-generated catch block
  28.             e.printStackTrace();
  29.         } catch (ParserConfigurationException e) {
  30.             // TODO Auto-generated catch block
  31.             e.printStackTrace();
  32.         } catch (XPathExpressionException e) {
  33.             // TODO Auto-generated catch block
  34.             e.printStackTrace();
  35.         }
  36.     }


11. 그닥 어렵지는 않았네.. 통신 환경 설정에 시간 대부분이 갔음.. 서비스 신청하고 테스트와 운영 서버 설정을 하는데.. 이게 잘 안됨..
그리고 여러대 운영하면 세미콜론으로 연결하면 된다.

12. 끗~~~! 뭘 봐!!


댓글 3개:

  1. 안녕하세요. .
    http://openapi.11st.co.kr/openapi/OpenApiFrontMain.tmall 여기에 가면 개발자 문서라 해서 검색만 나와있습니다.

    혹이 위 사이트외 문서가 있는지 궁급합니다.


    혹시 자료 있으면 aquua77@gmail.com 으로 보내 주실 수 있는지요

    답글삭제
    답글
    1. 저도 별도의 문서를 본게 아니라.. API 개발자 문서만 보고 했네요..

      기본은 HTTP 전문통신을 해서 받아온 값을

      API 문서 규격에 맞게 잘라서 쓴다고 생각하시면 됩니다..

      삭제

BE Band (비밴드) - 2024년 03월 02일 잠실새내 락앤롤욱스 공연

나의 10~20대를 보낸 잠실에서의 공연.. 오랜만에 가보니.. 여기가.. 마눌님과 자주 가던 영화관이었는데... 여긴 뭐가 있었는데... 란 추억도 떠올리며 기분좋게 감.​ 공연장은 좀 협소한 편이었고, 인천의 쥐똥나무 보다는 약간 크고... 인천 ...