초록 : 최근에 고객에게 편안한 API 인터페이스를 제공 해야하는 요구 사항이 있습니다. QA는 Testing을 위해 Postman을 사용하지만 Postman의 테스트 인터페이스는 비슷하지만 Java 통화와 다릅니다. 그래서 저는 RESTFUL API 인터페이스를 직접 테스트하는 프로그램을 작성하고 싶습니다. HTTPS를 사용하므로 HTTP의 처리도 고려해야합니다. Java를 사용하여 처음으로 Restful Interface를 호출 했으므로 여전히 공부해야하므로 자연스럽게 정보를 참조했습니다.
분석 :이 문제는 모듈 간의 통화와 다릅니다. 예를 들어, 두 개의 모듈 프론트 엔드와 백엔드가 있습니다. 프론트 엔드는 프론트 엔드 디스플레이를 제공하고 백엔드는 데이터 지원을 제공합니다. Hession을 사용하여 백엔드가 제공하는 서비스를 원격 서비스로 등록했습니다. 프론트 엔드 측면 에서이 원격 서비스는 백엔드 인터페이스에 직접 조정할 수 있습니다. 그러나 이것은 회사가 자체 프로젝트가 크게 결합 될 때 사용하는 데 문제가되지 않습니다. 그러나 이러한 원격 서비스를 고객에게 등록하면 좋지 않은 것처럼 보이고 커플 링이 너무 높습니다. 그래서 다음 방법을 사용하는 것을 고려합니다.
기본 소개
RESTFUL 인터페이스의 호출을 위해 프론트 엔드는 일반적으로 AJAX 호출을 사용하며 백엔드는 더 많은 방법을 사용할 수 있습니다.
이번에는 세 가지 유형이 소개됩니다.
1.httpurlconnection 구현
2.httpclient 구현
3. 봄의 resttemplate
1. httpclient
모든 사람은 httpclient에 익숙 할 수 있지만 그것에 익숙하지 않습니다. 예를 들어 원격으로 호출하고 URL을 요청한 다음 응답에서 반환 상태를 가져오고 정보를 반환 할 수 있기 때문에 익숙합니다. 그러나 오늘날의 주제는 HTTPS이므로 인증서 또는 사용자 인증 문제가 포함되어 있기 때문에 오늘은 조금 더 복잡합니다.
HTTPClient를 사용하여 관련 정보를 검색 한 후 새 버전의 httpclient가 이전 버전과 다르고 이전 버전과 호환되는 것을 발견했지만 더 이상 이전 버전을 사용하는 것이 권장되지 않습니다. 많은 방법이나 클래스가 구식으로 표시되었습니다. 오늘날, 우리는 기존 버전 4.2와 최신 버전 4.5.3을 사용하여 각각 코드를 작성할 것입니다.
오래된 버전 4.2
인증 필요성
인증서 인증 사용은 인증서 준비 단계에서 선택됩니다.
package com.darren.test.https.v42; import java.io.file; import java.io.fileInputStream; import java.security.keystore; import org.apache.http.conn.ssl.sslsocket factory; public httpscertificalclient extensts (problic httpscertifiedclient) {{} @Override public void propereCertificate ()는 예외를 겪고 {// 키 라이브러리를 가져옵니다 keystore trustStore = keystore.getInstance (keystore.getDefaultType ()); fileInputStream input = new FileInputStream (새 파일 ( "c : /users/zhda6001/downloads/doftware///koftware/"); fileInputStream input = new FileInputStream (새 파일 ( "C : /users/zhda6001/downloads/xxx.keystore")); // 키 라이브러리의 비밀번호 (instream, "password".tocharray ()); // 키 라이브러리 등록 this.socketFactory = new SslSocketFactory (TrustStore); // 도메인 이름 SocketFactory.sethostNameVerifier (sslsocketfactory.allow_all_vername_verifier);인증을 건너 뛰십시오
인증서 준비 단계에서 인증을 건너 뛰는 옵션은 다음과 같습니다.
package com.darren.test.https.v42; import java.security.cert.certificateexception; import java.security.cert.cert.x509certificate; import javax.net.ssl.sslcontext; import javax.net.ssl.trustmanager; import javax.net.ssl.x509trustmanager; org.apache.http.conn.ssl.sslsocketfactory; public class httpstrustclient httpsclient {public httptrustclient () {} @override public void preperecertificate () throws exception {// 인증서 검증 sslcontext ctx = sslcontext.getinstance ( "tls"); x509trustmanager tm = new x509trustmanager () {@override public void checkclientTrusted (x509certificate [] 체인, String authtype) strows inpertipateException {} @Override public void checkSertrusted (X509CETTIFICATE) [] atricationexception {} @override public x509certificate [] getAcceptedissuers () {return null;}}; // 신뢰할 수있는 인증서 ctx.init (null, new trustmanager [] {tm}, null)로 설정 sslsocketfactory.alown_all_hostname_verifier);}}요약
이제 두 클래스 모두 동일한 클래스 httpsclient를 상속 받고 HttpsClient는 defaulthttpclient 클래스를 상속합니다. 템플릿 메소드 패턴이 여기에서 사용된다는 것을 알 수 있습니다.
package com.darren.test.https.v42; import org.apache.http.conn.clientConnectionManager; import org.apache.http.conn.scheme.scheme; import org.apache.http.conn.ssl.sslsocketfactory; import org.apache.http.impl.client.defaulthttpclient; public acplact class httpsclient를 확장하여 defaulthttpclient {protected sslsocketfactory socketfactory;/** * @return * @Throws 예외 */public httpsclient () throws 예외를 반환합니다. {this.preparecertificate (); this.regist (); this를 반환;}/*** 증명서 검증 준비** @throws 예외*/public acpract void repareCertificate () 예외를 던지기 예외;/*** 포트 등록*/protected void regist () {clientconnectionmanager ccm. this.getConnectionManager (); schemeregistry sr = ccm.getSchemeregistry (); sr.register (new scheme ( "https", 443, socketfactory));}}아래는 도구 클래스입니다
package com.darren.test.https.v42; import java.util.arraylist; import java.util.list; import java.util.map; import java.util.set; import org.apache.http.httpentity; import org.apache.http.httpronge; import; org.apache.http.namevaluepair; import org.apache.http.client.entity.urlencodedformentity; import org.apache.http.client.methods.httpget; import org.apache.http.client.methods.httppost; 수입 org.apache.http.client.methods.httprequestbase; import org.apache.http.message.basicnamevaluepair; import org.apache.http.util.entityutils; public httpsclientutil {public eTatic final string default_chars = "utf-8"; dopost (httpsclient httpsclient, string url, map <string, string> paramheader, map <string, string> parambody) 예외 {return dopost (httpsclient, url, paramheader, parambody, default_charset);} public static string dopost (httpsclient httpsclient, map <string, map <, map <, map <, map <, string, map <, string). String> parambody, String charset) 예외 {string result = null; httppost httppost = new httppost (url); setheader (httppost, paramheader); setbody (httppost, parambody, charset); httpresponse 응답 = httppsclient (httppsclient); {httpentity fenentity = response.getentity (); if (분개! = null) {result = entityutils.tostring (inentity, charset);}} return result;} public static string doget (httpsclient httpsclient, String Url, Map <String> Retho <String, string, parambody). doget (httpsclient, url, paramheader, parambody, default_charset);} public static string doget (httpsclient httpsclient, String Url, Map <String, String> Paramheader, Map <String, String> parambody, String charset excection re result = null; httpget httpget httpget (url); setheader (httpget, paramheader); httpresponse response = httpsclient.execute (httpget); if (response! = null) {httpentity isentity = response.getentity (if (inentity! = null)) 결과;} private static void setheader (httprequestbase request, map <string, string> paramheader) {// set header if (paramheader! = null) {set <string> keyset = paramheader.keyset (); for (string key : keyset) {key, paramheader.get (key))); setbody (httppost httppost, map <string, string, string> parambody, String charset) 예외를 {// set 매개 변수 if (parambody! = null) {list <namevaluepair> list = new arraylist <namevaluepair> (); set <string> keyset = parambody.keyset (); BASICNAMEVALUEPAIR (key, parambody.get (key));} if (list.size ()> 0) {urlencodedDformentity entity = new urlencodedformentity (list, charset); httppost.setity (엔터티);}}}그런 다음 테스트 클래스가 있습니다.
package com.darren.test.https.v42; import java.util.hashmap; import java.util.map; public class httpsclienttest {public static void main (String [args)) 예외 {httpsclient httpsclient = null = new httpstrustclient (). init (); // httpsclient = new httpsCertifiedClient (). init (); 문자열 url = "https://1.2.6.2:8011/xxx/api/gettoken" ;//string url ="https://1.2.6.2:8011/xxx/api/gethealth "; map <string, string> paramheader = new Hashmap <> (); // paramheader.put ( "content-type", "application/json"); paramheader.put ( "accept", "application/xml"); map <string, string> parambody = new Hashmap <> (); parambody.put ( "client_id", "[email protected]"); parambody.put ( "client_secret", "p@ssword_1"); 문자열 = httpsclientutil.dopost (httpsclient, ur ur reting, urbody); httpsclientutil.doget (httpsclient, url, null, null); System.out.println (결과);}}반품 정보 :
<? xml 버전 = "1.0"encoding = "utf-8"?> <TOKEN> JKF8RL0SW+SKKFLJ8RBKI5HP1BEQKK8PRCUTZPPBINQMYKRMXY1KWCJMCFT191ZPP88V1AGHW8OYNWJEYS 0axplugax89ejcownbikcc1uvfyesxhlktcjqyufivjevhreqxjphnclqywp+xse5od9x8vkkk7inntmrzqk7ybtz /e3u7gswm/5cvahfl6o9req9cwpxavznohyvnxsohszdo+bxatxxa1xpedpledly/8h/uap4n4dlzdjj3b8t1xh+crriom opxf7c5wkhtokeoexw+xopqkkkkkkkkkkkkwwjppugiifwf/paqwg+juosvt7qgdpv8pmwj9dwewjtdxgudg == </token>
새로운 버전 4.5.3
인증 필요성
package com.darren.test.https.v45; import java.io.file; import java.io.fileinputStream; import java.security.keystore; import javax.net.ssl.sslcontext; import org.apache.http.conn.ssl.sslconcocketsocketfactory; import; org.apache.http.conn.ssl.sslconnectionsocketfactory; import org.apache.http.conn.ssl.trustselfsignedstrategy; import org.apache.http.ssl.sslcontexts; public httpsclient extends {problic httpscertedclient {) {{} @Override public void propereCertificate ()는 예외를 겪고 {// 키 라이브러리를 가져옵니다 keystore resportStore = keystore.getInstance (keystore.getDefaultType ()); fileInputStream instream = new FileInputStream (새 파일 ( "C : /users/zhda6001/downloads/doftware///koftware ,/xxxware//xxwarke. fileInputStream instream = new FileInputStream (새 파일 ( "C : /users/zhda6001/downloads/xxx.keystore")); {instream, "password".tocharray ());}의 {// 비밀번호를 try {instream.close ();} sslcontext sslcontext = sslcontexts.custom (). loadTrustMaterial (TrustStore, TrustSignedStrategy.instance). this.connectionSocketFactory = 새로운 SSLConnectionSocketFactory (SSLContext);}}인증을 건너 뛰십시오
package com.darren.test.https.v45; import java.security.cert.certificatexception; import java.security.cert.x509certificate; import javax.net.ssl.sslcontext; import javax.net.ssl.trustmanager; import javax.net.ssl.x509trustmanager; org.apache.http.conn.ssl.sslconnectionsocketfactory; public class httpstrustclient httpsclient {public httpstrustclient () {} @override public void preparecertificate () wrows exception {// 증명서 확인 sslcontext ctx = sslcontext.getinstance ( "tls"); x509trustmanager tm = new x509trustmanager () {@override public void checkclientTrusted (x509certificate [] 체인, String authtype) strows inpertipateException {} @Override public void checkSertrusted (X509CETTIFICATE) [] atricationexception {} @override public void checkServerTrusted (x509certificate [] 체인, 문자열 authtype) repertipateException {}} @Override public x509certificate [] getAcceptedIssuers () {return null;}}; // 신뢰할 수있는 인증서에 세트를 설정합니다. null); this.connectionSocketFactory = 새로운 SSLConnectionSocketFactory (CTX);}}요약
package com.darren.test.https.v45; import org.apache.http.config.registry; import org.apache.http.config.registrybuilder; import org.apache.http.conn.socket.cocket.apache.http.conn.socket.socket.socket.socket.socket.socket.socket.socket.socket.socket org.apache.http.impl.client.closeablehttpclient; import org.apache.http.impl.client.httpclientBuilder; import org.apache.http.impl.client.httpclients; import org.apache.http.impl.conn.poolinghtplients httpsclient는 httpclientBuilder {private closeblehttpclient client; 보호 된 ConnectionSocketFactory ConnectionSocketFactory;/** * 초기화 httpsclient * * @Throws Exception */public closeblehtttpclient init () 예외 {this.prepercertficate (); this.client;}/** * Prepare certificate verification* * @throws Exception */public abstract void prepareCertificate() throws Exception;/** * Register protocol and port, this method can also be rewritten by subclasses*/protected void regist() {// Set the object corresponding to protocol http and https that handles socket link factory Registry<ConnectionSocketFactory> socketFactoryRegistry = 레지스트리 빌더. <connessocketFactory> create () .register ( "http", plainconnectionsocketfactory.instance) .register ( "https", this.connectionsocketfactory) .build (); poolinghttpclientConnectionManager Connmanager = new poolinghttpclientConnectionManager (SocketFactoryRegistry); httpclients.custom (). setConnectionManager (connmanager); // 사용자 정의 httpclient 객체를 만듭니다. httpclients.createdefault ();}}도구 :
package com.darren.test.https.v45; import java.util.arraylist; import java.util.list; import java.util.map; import java.util.set; import org.apache.http.httpentity; import org.apache.http.http.httpronge; import; org.apache.http.namevaluepair; import org.apache.http.client.httpclient; import org.apache.http.client.entity.urlencodedformentity; import org.apache.http.client.methods.httpget; 가져 오기; org.apache.http.client.methods.httppost; import org.apache.http.client.methods.httprequestbase; import org.apache.http.message.basicnamevaluepair; import org.apache.http.util.entityutils; string default_charset = "utf-8"; public static string dopost (httpclient httpclient, string url, map <string, string, string, map <string, string> parambody) 예외 {return dopost (httpclient, url, url, url, url, parambody, default_chatset); public string, httplient, public httplient, public string (httplient) url, map <string, string> paramheader, map <string, string> parambody, String charset) 예외 {string result = null; httppost httppost = new httppost (url); setheader (httppost, paramheader); setbody (httppost, parambody, charset); httpclient.execute (httppost); if (response! = null) {httpentity fenentity = response.getentity (); if (inentity! = null) {result = entityutils.tostring (isentity, charset);}}} public string (httpclient httpclient, string, map). 매개 변수, map <string, string> parambody)는 예외를 {return doget (httpclient, url, paramheader, parambody, default_charset);} public static string doget (httpclient httpclient, String URL, map <string, string> paramheader, map <string, string> parambody, string charset) httpget = new httpget (url); setheader (httpget, paramheader); httpresponse response = httpclient.execute (httpget); if (response! = null) {httpentity isentity = response.getentity (); if (resentity! = null) {intityutil. charset);}} return result;} private static void setheader (httprequestbase request, map <string, string> paramheader) {// set header if (paramheader! = null) {set <string> keyset = paramheader.keyset (); for (string key : keyset) {request.addheader (key, paramheader.get (key));}}} private static void setbody (httppost httppost, map <string, string> parambody, String charset) 예외 {// set parameters {parambody! = null) ArrayList <NamesValuePair> (); set <string> keyset = parambody.keyset (); for (string key : keyset) {list.add (new BasicNameValuePair (key, parambody.get (key));} if (list.size ()> 0) {urlencodedformentity entnity = new urlEdedforment (list) charset); httppost.setentity (엔티티);}}}}테스트 클래스 :
package com.darren.test.https.v45; import java.util.hashmap; import java.util.map; import org.apache.http.client.httpclient; public class httpsclientTest {public static void main (문자열 [] Args) 예외 {httpclient httpclient = null; // httpclient = new httpsTrustClient (). init (); httpclient = new httpsCertifiedClient (). init (); 문자열 url = "https://1.2.6.2:8011/xxx/api/gettoken" ;//string url ="https://1.2.6.2:8011/xxx/api/gethealth "; map <string, string> paramheader = new Hashmap <> (); paramheader.put ( "accept", "application/xml"); map <string, string, parambody = new hashmap <> (); parambody.put ( "client_id", "[email protected]"); parambody.put "; httpsclientutil.dopost (httpclient, url, paramheader, parambody); // 문자열 result = httpsclientutil.doget (httpsclient, url, null, null); System.out.println (결과);}}결과:
<? xml 버전 = "1.0"encoding = "utf-8"?> <TOKEN> RXITF9 // 7NXWXJS2CJIJYHLTVZNVMZXXEQTGN0U07SC9YSJEIBPQTE3HCJULSKOXOXPEUYGUVEY9JV7/WI klrzxykc3ospatsm0kcbckphu0tb2cn/nfzv9fmlueowfbdyz+n0seiik+0gp7920dfencn17wujvmc0u2jwvm5fa JQKMILWODXZ6A0DQ+D7DQDJWVCWXBVJ2ILHYIB3PR805VPPMI9ATXRVAKO0ODA006WEJFOFCGYG5P70WPJ5RRBL85V fy9wcvkd1r7j6nvjhxgh2gnimhkjejormjdxw2gkiusiwseli/xpswao7/ctwnwtnctgk8px2zub0zfa == </token>
2. httpurlconnection
@ControllerPublic Class Restfulaction {@autowired private userervice userervice; // @requestmapping (value = "put/{param}", method = requestmethod.put) public @Response Body String Put (@PathVariable String PARAM) {return " + param;} // add @RequestMapping (value ="past/{PARMAL} ", requestMethod.post) public @responsebody string post (@pathvariable string param, 문자열 ID, 문자열 이름) {System.out.println ( "id :"+id); System.out.println ( "name :"+name); return "post :"+param;} // value @Replese/{param} ", method = withmethod) 문자열 delete (@pathvariable string param) {return "delete :" + param;} // @RequestMapping (value = "get/{param}", method = requestmethod.get) public @ResponseBody String get (@PathVariable String Param) {return "get :" + param;} // httpurlConnection Method (httpurlConnection Method)는 restffe interface // retufffeat worly interface // "DealCon/{param}") public @ResponseBody String DealCon (@PathVariable String Param) {try {string url = "http : // localhost : 8080/tao-manager-web/"; url+= (param+"/xxx"); url restserviceurl = new url (url); (httpurlConnection) restServiceUrl .openConnection (); // PARAM 소문자를 입력하고 포스트 삭제를 가져 오도록 변환하여 httpConnection.setRequestMethod (param.touppercase ()); // httpConnection.setRequestProperty ( "accept", ")); post ("post ". httpconnection.setdooutput (true); // httpconnection.setdoinput (true); // 매개 변수 string input을 전달합니다. urlencoder.encode ( "ahhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh httpconnection.getoutputStream (); outputStream.write (input.getBytes ()); outputStream.flush ();} if (httpConnection.getResponseCode ()! = 200) {새로운 runtimeexception ( "http get visuver REIDGER :" + httpconnection.getResponsecode (); responskBuffer = new BufferedReader (새 입력 스트림 리더 ((httpConnection.getInputStream ())); 문자열 출력; system.out.println ( "Server : /n"); {system.out.println (output);} httpconnection.disconnect ();} catch (marlormedurlexception e) {e.printstacktrace ();} catch (ioexception e) {e.printstacktrace ();} return "success";}}3. 봄의 resttemplate
Springmvc.xml이 추가되었습니다
<!-RESTTEMPLATE-> <!-HTTP 클라이언트 팩토리-> <bean id = "httpclientFactory"> <속성 이름 = "ConnectTimeOut"value = "100000" /> <속성 이름 = "readTimeOut"value = "10000" /> < /bean> <! <rettemplate-> <bean id = "horgclienter"> <honsuctor-arg ref = "hatuctor-reg =" </bean>
제어 장치
@ControllerPublic Class resttemPlateAction {@autowired private resttemplate 템플릿; @requestmapping ( "resttem") public @responsebody user resttem (string method) {user user = null; // 찾기 if ( "get".equals (method (method))) "http : // localhost : 8080/tao-manager-web/get/{id}", user.class, "wuwuwuwu"); // getforentity와 getforobject의 차이는 반환 값과 상태, 헤더 정보, 응답 <사용자> re = 템플릿을 얻을 수 있다는 것입니다. getforentity ( "http : // localhost : 8080/tao-manager-web/get/{id}", user.class, "wuwuwuwuwuwu"); system.out.println (re.getStatuscode ()); system.out.println (re.getbody ()); ( "post".equals (method)) {httpheaders headers = new httpheaders (); headers.add ( "x-auth-token", uuid.randomuuid (). toString (); multivaluemap <string, string, postparameters = new LinkedMultivaluemap <string> (); PostparameTers (); "ahhhh"); postparameters.add ( "name", "partial version"); httpentity <multivaluemap <string, string >> requestentity = new httpentity <multivaluemap <string, string >> (postparameters, emer = emplate.postforobject "http : // localhost : 8080/tao-manager-web/post/aaa", requestentity, user.class); // delete} else if ( "delete".equals (method)). {template.delete ( "http : // localhost : 8080/tao-manager-web/delete/{id}", "aaa"); // modify} else if ( "put".equals (method)). {template.put ( "http : // localhost : 8080/tao-manager-web/put/{id}", null, "bbb");} return user;}}위의 내용은 Java가 RESTFul API 인터페이스를 부르는 방식을 간략하게 논의하는이 기사의 전체 내용입니다. 모든 사람에게 도움이되기를 바랍니다. 관심있는 친구는이 웹 사이트에서 다른 Java 관련 주제를 계속 참조 할 수 있습니다. 단점이 있으면 메시지를 남겨 두십시오. 이 사이트를 지원해 주신 친구들에게 감사드립니다!