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. 끗~~~! 뭘 봐!!


2016년 1월 7일 목요일

MSSQL에서 소숫점 입력하다가... 에러 발생..

decimal로 컬럼을 설정하고..

사이즈는 그냥 디폴트로 했더니.. 8.8 이 기본으로 잡혔다..

그런데.. 3.5 란 값을 없데이트 했더니..

아래와 같은 오류 발생..

numeric을(를) 데이터 형식 numeric(으)로 변환하는 중 산술 오버플로 오류가 발생했습니다.


흠?? 이상하네.. 그냥 같은 타입인데.. casting 안 한거 같은 오류가 날까? 하다가..

이것 저것 찾아봐도.. 그냥 데이터 유형 잘못이라고 하는데..

컬럼의 Precision을 다시 수정해 봄.. 8.2 로.. 변경 하니..


된다...

뭐지??

일단 예상은.. squrrel에서 meta 정보를 보니.. 처음에는

Precision 이 8, Scale 이 8로 되어 있고, ColumnDisplaySize가 10으로 되어 있음..

이 상태에서 Scale이 2로 변경되니 문제 없음..

Precision과 Scale의 합이 커서 그런거 같다는 생각은 듬..

애초에 8.8로 설정을 안해줬음 되잖여!!!

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

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