나는 Qingming Festival Holiday를 사용하여 웹 서비스의 관련 내용을 검토하고 작업 원칙을 간단히 요약했습니다. 도움이 필요한 친구들과 미래의 언급을 위해. 부적절한 기사가 있으면 친구에게 서로 격려 할 수있는 귀중한 제안을하도록 요청하십시오.
웹 서비스에서 우리는 먼저 관련 용어의 의미를 이해해야합니다 : WSDL, UDDI .... 관련 용어의 도입은 여기서 반복되지 않지만 초점은 원칙에 따라야합니다.
웹 서비스에는 서비스 제공 업체, 서비스 요청자 및 서비스 중개자의 세 가지 역할이 있습니다. 세 사이의 관계는 그림 1-1에 나와 있습니다.
완전한 웹 서비스 구현에는 다음 단계가 포함됩니다.
◆ 웹 서비스 제공 업체는 웹 서비스를 설계하고 구현하고 웹 서비스 중개자를 통해 웹 서비스의 올바른 디버깅을 게시하여 UDDI 등록 센터에 등록합니다. (게시)
◆ 웹 서비스 요청자는 웹 서비스 중개자에게 특정 서비스를 요청하고 중개자는 요청을 충족하는 서비스를 찾기위한 요청에 따라 UDDI 등록 센터를 쿼리합니다. (발견)
◆ 웹 서비스 중개자는 조건을 충족하는 웹 서비스 설명 정보를 웹 서비스 요청자에게 반환합니다. 설명 정보는 WSDL로 작성되며 웹 서비스를 지원하는 다양한 컴퓨터에서 읽을 수 있습니다. (발견)
◆ 웹 서비스 중개자에서 반환 된 설명 정보 (WSDL)를 사용하여 해당 비누 메시지를 생성하고 웹 서비스 제공 업체로 보내 웹 서비스의 호출을 실현합니다. (제본)
◆ 웹 서비스 제공 업체는 SOAP 메시지에 따라 해당 웹 서비스를 실행하고 서비스 결과를 웹 서비스 요청자에게 반환합니다. (제본)
그림 1-1 웹 서비스 아키텍처
참고 : WSDL의 기능은 웹 서비스 매뉴얼입니다. 서비스 요청자는이 WSDL에 따라 해당 비누 메시지를 생성합니다. SOAP 요청 메시지를받은 후 서비스 제공 업체는 서비스를 바인딩합니다.
다음 코드는 web.xml의 서블릿 구성입니다
<!- 서블릿 또는 JSP 페이지에 초기화 매개 변수 또는 사용자 정의 URL을 공식화 할 때 서블릿 또는 JSP 페이지를 이름으로 지정해야합니다. 서블릿 요소는이 작업을 완료하는 데 사용됩니다. -> <servlet> <servlet-name> userervice </servlet-name> <servlet-class> com.sun.xml.ws.transport.http.servlet.wsservlet </servlet-class> <!-컨테이너가 시작했을 때이 서블릿을로드하는지 여부를 표시하십시오 (Instand and Call values () 값이 더 작습니다. 먼저 시작하면-> </servletup> </servlet> <!-서버는 일반적으로 http : // http : // webappprefix/servlet/servletname을 제공합니다 <servlet-mapping> <servlet-name> uservice </servlet-name> <!-URL 패턴 요소의 값은 슬래시 (/)로 시작해야합니다. 녹색 섹션은 서비스의 외부 인터페이스입니다. 해당 jax-ws.xml 파일을 찾으십시오 (아래 그림과 같이) <endpoint name = "userport"구현 = "cn.ujn.service.userservice"url-pattern = "/user"> </endpoint>
그런 다음 관련 해당 구현 클래스 CN.UJN.Service.userservice에 제대로됩니다. 클라이언트가 보낸 SOAP 요청 메시지 본문에는 클라이언트가 요청한 메소드 이름 및 매개 변수 정보가 포함되어 있습니다.
다음은 클라이언트가 캡슐화 한 SOAP 메시지 본체 (JSON 모드에서 서버와의 데이터 전송) (SOAP Rerquest Envelope)입니다.
<SOAPENV : 봉투 XMLNS : SOAPENV = "http://schemas.xmlsoap.org/soap/envelope/"xmlns : q0 = "http://ujn.cn/"xmlns : xsd = "http://www.w3.org/2001/xmschema. xmlns : xsi = "http://www.w3.org/2001/xmlschema-instance">- <soapenv : body>- <q0 : login> <arg0> { "username": "shq", "shq"</arg0> </q0 : login> 다음은 웹 서비스를 호출하는 SOAP1.1 프로토콜입니다.
/*** SOAP1.1 프로토콜을 통해 웹 서비스 호출** 텍스트/XML 이것은 SOAP1.1 프로토콜* @Param 메소드 메소드 이름* @Param 네임 스페이스 네임 스페이스* @Param HeaderParameters HeaderParam BodyParameters Body Body Body MARAMETER* @PARAM PARMERABITER AHABODYABODY AMETERS의 BODYABODERABODERABODER 본문 매개 변수의 네임 스페이스 * @return String * @throws Exception */ public static string invokeBysoap11 (문자열 wsdl, 문자열 메소드, 문자열 네임 스페이스, 맵 <문자열, 문자열> 헤드러 파라미터, 맵 <문자열> bodyparameters, boolean isbodyparametersns) 예외 {StringBuffer soapfresult = null; // 제거? wsdl, 메소드 목록을 가져옵니다. wsdl = wsdl.substring (0, 길이 -5); // 매개 변수로 문자열로 URL 인스턴스를 만듭니다. url url = new url (wsdl); // 연결 생성 httpurlConnection conn = (httpurlConnection) url.openConnection (); // 요청 메소드를 설정합니다 Conn.setRequestMethod ( "post"); // 입력에 URL 연결을 사용하려면 doinput 플래그를 true conn.setdoinput (true)로 설정하십시오. // 출력에 URL 연결을 사용하려면 doinput 플래그를 true conn.setdooutput (true)로 설정하십시오. // 주로 httpurlConnection 요청 헤더에서 속성 (kv)을 설정합니다. conn.setRequestProperty ( "content-type", "text/xml; charset = utf-8"); // 입력 스트림을 가져옵니다 (클라이언트를 상대적으로, 출력 스트림 사용) outputStream out = conn.getoutPutStream (); // SOAP를 가져옵니다 1.1 버전 메시지 StringBuilder sb = new StringBuilder (); sb.append ( "<soap : 봉투 xmlns : xsi =/"http://www.w3.org/2001/xmlschema-instance/ "xmlns : xsd =/"http://www.w3.org/2001/xmlschema/ " xmlns : soap =/"http://schemas.xmlsoap.org/soap/envelope/" "); sb.append ( "xmlns : ns0 =/" " + 네임 스페이스 +"/""); sb.append ( ">"); // 메시지 헤더를 조립합니다. for (enther <string, string> headerparameter : headerparameters .entryset ()) {sb.append ( "<ns0 :"); sb.append (HeaderParameter.getKey ()); sb.append ( ">"); sb.append (HeaderParameter.getValue ()); sb.append ( "</ns0 :"); sb.append (HeaderParameter.getKey ()); sb.append ( ">"); } sb.append ( "</soap : header>"); } // 메시지 body sb.append ( "<soap : body> <ns0 :"); sb.append (메소드); sb.append ( ">"); // 입력 매개 변수 if (bodyParameters! = null) {for (enther <string, String> inputParameter : bodyParameters .entryset ()) {if (isbodyParametersns) {sb.append ( "<ns0 :"); sb.append (inputparameter.getKey ()); sb.append ( ">"); sb.append (inputparameter.getValue ()); sb.append ( "</ns0 :"); sb.append (inputparameter.getKey ()); sb.append ( ">"); } else {sb.append ( "<"); sb.append (inputparameter.getKey ()); sb.append ( ">"); sb.append (inputparameter.getValue ()); sb.append ( "</"); sb.append (inputparameter.getKey ()); sb.append ( ">"); }}} sb.append ( "</ns0 :"); sb.append (메소드); sb.append ( "> </soap : body> </soap : 봉투>"); // test system.out.println (sb.toString ()); // 비누 메시지 (클라이언트와 관련하여, out.write ()가 사용됨) out.write (sb.toString (). getBytes ()); // 서버에서 해당 int 코드를 가져옵니다. if (code == 200) {inputStream은 = conn.getInputStream (); 바이트 [] B = 새로운 바이트 [1024]; int len = 0; soapofresult = new StringBuffer (); // 입력 스트림에서 특정 바이트를 읽고 버퍼 배열에 저장하십시오. b. 스트림이 파일 끝에 있기 때문에 사용 가능한 바이트가없는 경우 실제 바이트 수를 반환합니다. 값은 -1입니다. while ((len = is.read (b))! = -1) {// 바이트 배열을 이름 지정된 숯을 사용하여 문자열로 변환합니다. 문자열 s = 새 문자열 (b, 0, len, "utf-8"); SOAPOFRESULT.APPEND (S); }} conn.disconnect (); 반환 soapfresult == null? NULL : SOAPOFRESULT.TOSTRING (); } 참고 : SOAP 요청 메시지를 전한 후 클라이언트가 차단됩니다. 서버가 상태 코드를 반환 할 때까지.
다음은 서버 응답 (SOAP 응답 봉투)입니다.
<S : 봉투 XMLNS : S = "http://schemas.xmlsoap.org/soap/envelope/">-<s : body>-<ns2 : loginresponse xmlns : ns2 = "http://ujn.cn/ "> 1 </return> </ns2 : loginr respone> </s : body> </s : 봉투>
서버에서 전송 된 JSON 데이터를 수신 한 후 클라이언트는 해당 구문 분석 작업을 수행합니다. 다음과 같이 :
// SOAP 프로토콜을 구문 분석합니다 (DOM 파싱은 XML 문서 유형을 구문 분석하는 데만 사용될 수 있으며 SOAP 메시지는 XML 데이터 형식에 있습니다) 문서 doc = xmlutil.string2doc (결과); 요소 ele = (요소) doc.getElementsByTagName ( "return"). 항목 (0); 이 메소드에 사용 된 String2doc () 메소드는 다음과 같습니다. public static document string2doc (string str) {// XML 문서를 doc tree documentBuilDerfactory factory = DocumentBuilDerfactory.newinstance ()에 구문 분석합니다. 문서 문서 = null; DocumentBuilder 빌드; if (str == null || str.equals ( "")) {return null; } try {inputStream bais = new ByTearRayInputStream (str.getBytes ( "UTF-8")); build = factory.newdocumentBuilder (); // 주어진 inputStream의 내용을 XML 문서로 구문 분석하고 새 DOM 문서 개체를 반환합니다. document = build.parse (bais); } catch (예외 e) {e.printstacktrace (); } 반환 문서; } 리턴 결과에 따르면 클라이언트는 해당 처리를 수행합니다.
위는 웹 서비스의 기본 작업 원칙입니다.
읽어 주셔서 감사합니다. 도움이되기를 바랍니다. 이 사이트를 지원 해주셔서 감사합니다!