SOAP client
unknown
java
a year ago
10 kB
7
Indexable
package com.vnpay.vna_ticket_redeem.service.impl; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.vna_ticket_redemption.beans.https.response.ApiResponse; import com.vnpay.vna_ticket_redeem.common.BaseClass; import com.vnpay.vna_ticket_redeem.service.BaseService; import com.vnpay.vna_ticket_redeem.service.JAXBContextResponse; import lombok.AllArgsConstructor; import lombok.NoArgsConstructor; import lombok.SneakyThrows; import org.apache.http.HttpEntity; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; import org.springframework.http.HttpMethod; import org.springframework.stereotype.Service; import javax.servlet.http.HttpServletRequest; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBElement; import javax.xml.bind.Unmarshaller; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamReader; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.util.Objects; /** * @author khoakd * 10/11/2023 */ @Service @AllArgsConstructor public class BaseServiceImpl extends BaseClass implements BaseService { private final ObjectMapper objectMapper; private HttpServletRequest servletRequest; private String removeSpacesFromXML(String xml) { // Remove spaces, newlines, and tabs return xml.replaceAll("\\s+", "").replaceAll("\t", ""); } @SneakyThrows @Override public <T> ApiResponse<T> callAPI(String soapMess, String resultTag, Class type, int timeout, String logString, String soapAction, String instance, String apiUrl, String keyReq) { CloseableHttpClient httpClient = null; ApiResponse<T> retDate = new ApiResponse<>(); try { log.info(logString + "|START " + ", Tag=" + resultTag + ",Timeout=" + timeout + ",SoapMessage=" + removeSpacesFromXML(soapMess) + ", apiUrl:" + apiUrl + "keyReq:" + keyReq); httpClient = HttpClients.createDefault(); RequestConfig cfg = RequestConfig.custom() .setConnectTimeout(timeout * 1000) .setSocketTimeout(timeout * 1000) .setConnectionRequestTimeout(timeout * 1000).build(); HttpPost postRequest = new HttpPost(apiUrl); postRequest.setConfig(cfg); postRequest.setHeader("Content-Type", "text/xml; charset=utf-8"); postRequest.setHeader("SOAPAction", soapAction); StringEntity entity = new StringEntity(soapMess, "utf-8"); postRequest.setEntity(entity); CloseableHttpResponse response = httpClient.execute(postRequest); HttpEntity entityReturn = response.getEntity(); String soapXmlResult = EntityUtils.toString(entityReturn); // header String log.info(logString + "|END, " + "Rsp:" + soapXmlResult + "|keyReq:" + keyReq); int indexOpen = soapXmlResult.indexOf("<soapenv:Header"); int indexClose = soapXmlResult.indexOf("</soapenv:Header>") + 17; if (indexOpen == -1) { indexOpen = soapXmlResult.indexOf("<soap:Header"); indexClose = soapXmlResult.indexOf("</soap:Header>") + 14; } if (indexOpen != -1) { retDate.setHeaderInformation(soapXmlResult.substring(indexOpen, indexClose)); } String xmlBody = soapXmlResult.substring(0, indexOpen) + soapXmlResult.substring(indexClose); log.info(logString + "|END, " + "Rsp_2:" + xmlBody + "|keyReq:" + keyReq); if (xmlBody.contains(resultTag)) { xmlBody = xmlBody.replace("¥", ""); XMLInputFactory xif = XMLInputFactory.newFactory(); InputStream is = new ByteArrayInputStream(xmlBody.getBytes()); XMLStreamReader xsr = xif.createXMLStreamReader(is); xsr.nextTag(); while (!xsr.getLocalName().equals(resultTag)) { xsr.nextTag(); } JAXBContext jaxbContext; switch (instance) { case "SEARCH_FLIGHT": { jaxbContext = JAXBContextResponse.getInstance().getJAXBContextSearchFlight(); break; } case "SELECT_FLIGHT": { jaxbContext = JAXBContextResponse.getInstance().getJAXBContextSelectFlight(); break; } case "ADD_INFO": { jaxbContext = JAXBContextResponse.getInstance().getJAXBContextAddInfo(); break; } case "GET_PRICE": { jaxbContext = JAXBContextResponse.getInstance().getJAXBContextGetPrice(); break; } case "CREATE_TST": { jaxbContext = JAXBContextResponse.getInstance().getJAXBContextCreateTST(); break; } case "CREATE_FORM_OF_PAYMENT": { jaxbContext = JAXBContextResponse.getInstance().getJAXBContextCreateFormOfPayment(); break; } case "SAVE_RESERVATION": { jaxbContext = JAXBContextResponse.getInstance().getJAXBContextSaveReservation(); break; } case "ISSUE_TICKET": { jaxbContext = JAXBContextResponse.getInstance().getJAXBContextIssueTicket(); break; } case "DOC_ISSUANCE_ISSUE_TICKET": { jaxbContext = JAXBContextResponse.getInstance().getJAXBContextDocIssuanceIssueTicket(); break; } case "QUOTE_PLACE_PNR": { jaxbContext = JAXBContextResponse.getInstance().getJAXBContextQuotePlacePNR(); break; } case "CANCEL_PNR": { jaxbContext = JAXBContextResponse.getInstance().getJAXBContextCancelPNR(); break; } case "ADD_REDEMPTION": { jaxbContext = JAXBContextResponse.getInstance().getJAXBContextAddRedemption(); break; } case "Security_SignOutReply": { jaxbContext = JAXBContextResponse.getInstance().getJAXBContextSignout(); break; } default: { jaxbContext = JAXBContext.newInstance(type); break; } } Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); JAXBElement<T> je = unmarshaller.unmarshal(xsr, type); /* convert success */ retDate.setResponseBody(je.getValue()); } else { /* response failed */ log.info(logString + "|FAILED| keyReq:" + keyReq); } } catch (Exception ex) { log.error("keyReq:" + keyReq + "| " + logString + "Exception call API, Tag=" + resultTag + ",Timeout=" + timeout + ",SoapMessage=" + soapMess + ", Exception:" + ex.getMessage(), ex); } finally { if (httpClient != null) { httpClient.close(); } } return retDate; } @NoArgsConstructor private class RestTemplateLogger { private String keyReq; private String method; private String function; private int status; private String url; private String requestBody; private String responseBody; private String responseHeader; private long startTime; public RestTemplateLogger injectRequest(String method, String url, String function, Object requestBody ) throws JsonProcessingException { this.keyReq = (String) servletRequest.getAttribute("keyReq"); this.method = method; this.url = url; this.function = function; this.requestBody = convertObjectToString(requestBody); this.startTime = System.currentTimeMillis(); return this; } public void injectResponse(int status, String responseBody, String responseHeader) { this.status = status; this.responseBody = responseBody; this.responseHeader = responseHeader; } private String convertObjectToString(Object data) throws JsonProcessingException { return objectMapper.writeValueAsString(data); } @Override public String toString() { StringBuilder logBuilder = new StringBuilder(); logBuilder.append("[KeyReq] = ").append(keyReq).append(","); logBuilder.append("[Begin call ").append(function).append(" function, "); logBuilder.append("\n [URI] = ").append(url).append(","); if (!HttpMethod.GET.matches(method) && !HttpMethod.DELETE.matches(method) && Objects.nonNull(requestBody)) { logBuilder.append("\n [REQUEST_BODY] = ").append(requestBody); } if (Objects.nonNull(responseBody)) { logBuilder.append("\n End call ").append(function).append(" function, "); logBuilder.append("\n[HTTP_STATUS = ").append(status).append(" ]"); logBuilder.append("\n [RESPONSE_TIME] = ").append(System.currentTimeMillis() - startTime); logBuilder.append("\n [RESPONSE_HEADERS] = ").append(responseHeader); logBuilder.append("\n [RESPONSE_BODY] = ").append(responseBody); } return logBuilder.toString(); } } }
Editor is loading...
Leave a Comment