Back-End/Spring

[SpringBoot] 배송조회 API 추천

HMHA 2023. 3. 21. 10:27
300x250
반응형
300x250

현재 개발중에 유용하게 사용중인 배송추적 API가 있어 소개드립니다.

저는 Java에서 따로 호출하여 사용중인데, JavaScript 페이지도 공유되어 있어서 올려드립니다.

제가 사용중인 Java code는 아래에 따로 추가했습니다.

 

출처 및 원글 : https://tracker.delivery/guide

 

 

 

 

링크형

배송조회 페이지를 팝업 형태를 띄우고 싶다면 아래와 같은 방식으로 코드를 넣으시면 됩니다.

<a href="https://tracker.delivery/#/:carrier_id/:track_id" target="_blank">배송조회</a>
      

API형

제공되는 웹 페이지를 이용하지 않고 Restful API에 직접 접근하여 데이터를 가져올 수 있습니다.

택배사 목록 조회 API

GET https://apis.tracker.delivery/carriers

[
   {
      "id": "de.dhl",
      "name": "DHL",
      "tel": "+8215880001"
   },
   {
      "id": "jp.sagawa",
      "name": "Sagawa",
      "tel": "+810120189595"
   },
   {
      "id": "jp.yamato",
      "name": "Kuroneko Yamato",
      "tel": "+810120189595"
   },
   {
      "id": "jp.yuubin",
      "name": "Japan Post",
      "tel": "+810570046111"
   },
   {
      "id": "kr.chunilps",
      "name": "천일택배",
      "tel": "+8218776606"
   },
   {
      "id": "kr.cjlogistics",
      "name": "CJ대한통운",
      "tel": "+8215881255"
   },
   {
      "id": "kr.cupost",
      "name": "CU 편의점택배",
      "tel": "+8215771287"
   },
   {
      "id": "kr.cvsnet",
      "name": "GS Postbox 택배",
      "tel": "+8215771287"
   },
   {
      "id": "kr.cway",
      "name": "CWAY (Woori Express)",
      "tel": "+8215884899"
   },
   {
      "id": "kr.daesin",
      "name": "대신택배",
      "tel": "+82314620100"
   },
   {
      "id": "kr.epost",
      "name": "우체국 택배",
      "tel": "+8215881300"
   },
   {
      "id": "kr.hanips",
      "name": "한의사랑택배",
      "tel": "+8216001055"
   },
   {
      "id": "kr.hanjin",
      "name": "한진택배",
      "tel": "+8215880011"
   },
   {
      "id": "kr.hdexp",
      "name": "합동택배",
      "tel": "+8218993392"
   },
   {
      "id": "kr.homepick",
      "name": "홈픽",
      "tel": "+8218000987"
   },
   {
      "id": "kr.honamlogis",
      "name": "한서호남택배",
      "tel": "+8218770572"
   },
   {
      "id": "kr.ilyanglogis",
      "name": "일양로지스",
      "tel": "+8215880002"
   },
   {
      "id": "kr.kdexp",
      "name": "경동택배",
      "tel": "+8218995368"
   },
   {
      "id": "kr.kunyoung",
      "name": "건영택배",
      "tel": "+82533543001"
   },
   {
      "id": "kr.logen",
      "name": "로젠택배",
      "tel": "+8215889988"
   },
   {
      "id": "kr.lotte",
      "name": "롯데택배",
      "tel": "+8215882121"
   },
   {
      "id": "kr.slx",
      "name": "SLX",
      "tel": "+82316375400"
   },
   {
      "id": "kr.swgexp",
      "name": "성원글로벌카고",
      "tel": "+82327469984"
   },
   {
      "id": "nl.tnt",
      "name": "TNT"
   },
   {
      "id": "un.upu.ems",
      "name": "EMS"
   },
   {
      "id": "us.fedex",
      "name": "Fedex"
   },
   {
      "id": "us.ups",
      "name": "UPS"
   },
   {
      "id": "us.usps",
      "name": "USPS"
   }
]

배송 조회 API

GET https://apis.tracker.delivery/carriers/:carrier_id/tracks/:track_id

Example https://apis.tracker.delivery/carriers/kr.epost/tracks/1111111111111

{
   "from": {
      "name": "",
      "time": ""
   },
   "to": {
      "name": "&nbsp;",
      "time": "&nbsp;T00:00:00+09:00"
   },
   "state": {
      "id": "information_received",
      "text": "방문예정"
   },
   "progresses": [],
   "carrier": {
      "id": "1111111111111",
      "name": "우체국 택배",
      "tel": "+8215881300"
   }
}

아래는 Java에서 사용하는 Method입니다

callLogAPI Method

	/*
	 * 택배사 API 조회
	 * url : TRACKER_URL / carrier_id : tracker code / track_id : 송장번호
	 * 
	 * https://apis.tracker.delivery/carriers/:carrier_id/tracks/:track_id
	 * 
	 * */
	public JSONObject callLogAPI(String carrierId , String trackId) {
	    
        //trackers HashMap<>은 택배사 정보와 코드를 넣어두었습니다
	HashMap<String,String> trackers = tracker.getTrackerName();
	String deliComName = trackers.get(carrierId);
		
		//System.out.println(carrierId);
		
		String responseBody = "";
		JSONObject retVal = new JSONObject();
		
	    String apiURL = TRACKER_URL+carrierId+"/tracks/"+trackId.replaceAll("-", "");
	    
	    responseBody = GETMethod(apiURL);
	    //System.out.println(responseBody);
	    
	    JSONObject statusJson = new JSONObject(responseBody);
	    JSONObject carrierJson = new JSONObject();
	    JSONArray progressJson = new JSONArray();
	    
	    //System.out.println(statusJson.toString());
	    
	    String mess = statusJson.has("message") ? statusJson.get("message").toString() : "";
	    
        //내용이 없는 경우
	    if(!mess.equals("")) {
	    	
			retVal.put("description", "보내시는 고객님께서 상품 발송 준비중입니다.");
			retVal.put("deliveryWorker", "미정");
			retVal.put("time", "미정");
			retVal.put("location", "미정");
			retVal.put("status", "발송준비");
			retVal.put("carrierId", trackId);
			retVal.put("company", deliComName);
    	    
    	    //System.out.println("발송준비 com = " + deliComName);
    	    
    	    JSONObject tempJson = new JSONObject(); //progressJson 대체
    	    JSONObject tempJson2 = new JSONObject(); //progressJson 안의 stateJson 대체
            
			DateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
			String datestr = format.format(Calendar.getInstance().getTime());
    		
    	    tempJson.put("description", "");
    	    tempJson2.put("name", "발송준비");
    	    tempJson.put("location", tempJson2);
    	    tempJson.put("time", datestr);
    	    
    	    tempJson2 = new JSONObject();
    	    tempJson2.put("id", "at_packing");
    	    tempJson2.put("text", "발송준비");
    	    
    	    tempJson.put("status", tempJson2);
    	    progressJson.put(tempJson);
    	    
    	    retVal.put("allProgress", progressJson);
    	    
	    	return retVal;
	    }
	    
        //Tracker API 결과값 확인
	    carrierJson = new JSONObject(statusJson.get("carrier").toString());
	    progressJson = new JSONArray(statusJson.get("progresses").toString());
	    statusJson = new JSONObject(statusJson.get("state").toString());
	    
	    for(int i = 0 ; i < progressJson.length() ; i++ ) {
	    	JSONObject initJson = progressJson.getJSONObject(i);
	    	JSONObject stat = initJson.getJSONObject("status");
	    	
	    	if(statusJson.get("id").equals(stat.get("id"))) {
	    		
	    		String[] delBracketText = new String[2];
				try {
					delBracketText = deleteBracket(initJson.getString("description"));
					stat = initJson.getJSONObject("location");
					retVal.put("description", delBracketText[0] == null ? "" : delBracketText[0]);
					retVal.put("deliveryWorker", delBracketText[1] == null ? "" : delBracketText[1]);
					retVal.put("time", initJson.getString("time"));
					retVal.put("location", stat.getString("name"));
					retVal.put("company", deliComName);
					retVal.put("allProgress", progressJson);
		    		
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
	    	}
	    }
	    
	    retVal.put("status", statusJson.getString("text"));
	    retVal.put("carrierId", carrierJson.getString("id"));
	    //System.out.println("retval is = " + retVal);
	    return retVal;
	}

배송기사 괄호정보만 따로 추출하는 Method

//괄호내 정보 제거 ( 배송기사 이름 및 전화번호 제거 )
    static String[] deleteBracket(String text) throws Exception {
		
		Matcher matcher = PATTERN_BRACKET.matcher(text);
		
		String removeText = text;
		String pureText = text;
		String VOID = "";
		
		PATTERN_BRACKET = Pattern.compile("\\([^\\(\\)]+\\)");
		matcher = PATTERN_BRACKET.matcher(pureText);
		while(matcher.find()) {
			int startIndex = matcher.start();
			int endIndex = matcher.end();
			
			removeText = pureText.substring(startIndex, endIndex);
			pureText = pureText.replace(removeText, VOID);
			matcher = PATTERN_BRACKET.matcher(pureText);
		}
		
		String[] values = new String[2];
		values[0] = pureText;
		values[1] = removeText;
		
		return values;
    }

GET 호출을 하는 Method

private static String GETMethod(String apiUrl){
		
        System.out.println(apiUrl);
        
        try {
            
        	URL url = new URL(apiUrl);
            
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");
            connection.setDoOutput(true);
            connection.setDoInput(true);
            
            int code = connection.getResponseCode();
            if(code == 200) {
            	String api = readBodyAPI(connection.getInputStream());
                return api;
            }else {
            	return "{\"message\":\"보내시는 고객님께서 상품 발송 준비중입니다.\"}";
            }
            
        } catch (IOException e) {
            throw new RuntimeException("API 요청과 응답 실패", e);
        } 
    }

Response된 API 정보를 읽는 Method

private static String readBodyAPI(InputStream body){
    	
        InputStreamReader streamReader = new InputStreamReader(body);

        try (BufferedReader lineReader = new BufferedReader(streamReader)) {
            StringBuilder responseBody = new StringBuilder();

            String line;
            while ((line = lineReader.readLine()) != null) {
                responseBody.append(line);
            }

            return responseBody.toString();
        } catch (IOException e) {
            throw new RuntimeException("API 응답을 읽는데 실패했습니다.", e);
        }
    }

 

300x250
반응형