Usei o feriado do Qingming Festival para revisar o conteúdo relevante do serviço da Web e resumi brevemente seu princípio de trabalho. Para referência de amigos necessitados e eles mesmos no futuro. Se houver algum artigo inadequado, peça a seus amigos que dêem sugestões valiosas para incentivar um ao outro.
Nos Serviços da Web, devemos primeiro entender o significado dos termos relacionados: WSDL, UDDI .... A introdução de termos relacionados não será repetida aqui, mas o foco estará no princípio.
Em um serviço da Web, existem três funções: provedor de serviços, solicitante de serviço e intermediário de serviço. A relação entre os três é mostrada na Figura 1-1
A implementação de um serviço completo da Web inclui as seguintes etapas:
◆ Os provedores de serviços da Web projetam e implementam serviços da Web e publiquem a depuração correta do serviço da Web através do Intermediário do Serviço da Web e registre -o no Centro de Registro UDDI; (Publicar)
◆ O solicitante do Serviço da Web solicita um serviço específico do intermediário do Serviço da Web, e o intermediário consulta o Centro de Registro UDDI com base na solicitação para encontrar um serviço que atenda à solicitação; (Descoberta)
◆ O Intermediário do Serviço da Web retorna as informações de descrição do Serviço da Web que atendem às condições ao solicitante do Serviço da Web. As informações de descrição são escritas no WSDL e podem ser lidas por várias máquinas que suportam serviços da Web; (Descoberta)
◆ Use as informações de descrição (WSDL) retornadas do intermediário do serviço da web para gerar mensagens de sabão correspondentes e enviá -las ao provedor de serviços da Web para realizar a chamada do serviço da web; (vinculativo)
◆ O provedor de serviços da Web executa o serviço da Web correspondente de acordo com a mensagem SOAP e retorna o resultado do serviço ao solicitante do Serviço da Web. (Vinculativo)
Figura 1-1 Arquitetura de Serviço da Web
Nota: A função do WSDL é um manual de serviço da web. O solicitante de serviço gera a mensagem SOAP correspondente com base neste WSDL. Depois de receber a mensagem de solicitação de SOAP, o provedor de serviços vincula o serviço.
O código a seguir é a configuração do servlet em web.xml
<!- Ao formular parâmetros de inicialização ou URLs personalizados nas páginas do servlet ou JSP, você deve primeiro nomear a página do servlet ou JSP. O elemento servlet é usado para concluir esta tarefa. -> <Verlet> <ame-name> userService </vetlet-name> <Servlet-class> com.sun.xml.ws.transport.http.servlet.wssertlet </servlet-class> <!-Marque o menor que o número de servlet é iniciado (instand e chamado) <! Aplicação primeiro quando é iniciado-> <Load-on-startp> 1 </load-on-startup> </ervlet> <!-O servidor geralmente fornece um URL padrão para o servlet: http: // host/webappprefix/servlet/servletname, no entanto, este URL é frequentemente alterado <Servlet-Mapping> <ame-name> UserService </ervlet-name> <!-descreve o URL em relação à raiz do aplicativo da web. A seção verde é a interface externa do serviço. Encontre o arquivo Jax-Ws.xml correspondente (como mostrado abaixo) <endpoint name = "userport" implementation = "cn.ujn.service.userService" url-tattern = "/user"> </ndpoint>
Em seguida, está vinculado à classe de implementação correspondente relevante CN.UJN.SERVICE.USERSERVICE. O corpo do corpo da mensagem de solicitação SOAP enviado pelo cliente contém o nome do método e as informações de parâmetro solicitadas pelo cliente.
A seguir, é apresentado o corpo da mensagem SOAP encapsulada pelo cliente (transmissão de dados com o servidor no modo JSON) (SOAP Rerquest Envelope):
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:q0="http://ujn.cn/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns: xsi = "http://www.w3.org/2001/xmlschema-stance">- <sOMENV: body>- <Q0: login> <gg0> {"userName": "shq", "senha": "shq"} </arg0> A seguir, o protocolo SOAP1.1 invocando o serviço da web
/** * Calling the web service through the SOAP1.1 protocol* * text/xml This is based on the soap1.1 protocol* * @param wsdl WSDL path* @param method method method name* @param namespace namespace* @param headerParameters headerParameters header parameter* @param bodyParameters body parameter* @param isBodyParametersNS body parameter Whether there is Um espaço para nome para o parâmetro do corpo * @return string * @throws Exception */ public static string InvokeBySoAap11 (String wsdl, método de string, string namespace, mapa <string, string> headerParameters, mapa <string> bodyparameters, boolean isbodametersns) excepção {stringbuffer sonesofrafrasler // remove? Wsdl, obtenha a lista de métodos int length = wsdl.length (); wsdl = wsdl.substring (0, comprimento - 5); // Crie a instância de URL com string como parâmetros url url = novo url (wsdl); // Crie conexão httpurlConnection Conn = (httpurlConnection) url.openconnection (); // Defina o método de solicitação Conn.SetRequestMethod ("post"); // Se você planeja usar uma conexão de URL para entrada, defina o sinalizador doinput como True Conn.SetDoinput (true); // Se você planeja usar uma conexão de URL para saída, defina o sinalizador doinput como True Conn.SetDoOutput (true); // Defina principalmente o atributo (KV) no cabeçalho da solicitação de httpurlConnection Conn.SetRequestProperty ("conteúdo-tipo", "text/xml; charset = utf-8"); // Obtenha o fluxo de entrada (em relação ao cliente, use outputStream) outputStream out = Conn.getOutputStream (); // Obtenha a mensagem SOAP1.1 Mensagem StringBuilder SB = new StringBuilder (); sb.append ("<SOAP: envelope xmlns: xsi =/" http://www.w3.org/2001/xmlschema-instance/ "xmlns: xsd =/" http://wwwww3 xmlns: sabão =/"http://schemas.xmlsoap.org/soap/envelope//" "); sb.append ("xmlns: ns0 =/" " + namespace +"/""); sb.append (">"); // monta o cabeçalho da mensagem if (headerParameters! = Null) {sb.append ("<sabão: cabeçalho>"); para (entrada <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 ("</sabão: cabeçalho>"); } // monta o corpo da mensagem sb.append ("<sabão: corpo> <ns0:"); sb.append (método); sb.append (">"); // parâmetro de entrada if (bodyparameters! = Null) {for (entradas <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 (método); sb.append ("> </sabão: corpo> </sabão: envelope>"); // test system.out.println (sb.toString ()); // Escreva mensagens de sabão (em relação ao cliente, out.Write () é usado) Out.Write (sb.toString (). GetBytes ()); // Obtenha o código int correspondente no lado do servidor = Conn.GetRESPONSecode (); if (code == 200) {inputStream IS = Conn.getInputStream (); byte [] b = novo byte [1024]; int len = 0; SoapOfResult = new StringBuffer (); // Leia um certo número de bytes do fluxo de entrada e armazene -os na matriz buffer b. Retorna o número real de bytes lidos como um número inteiro // se não houver bytes disponíveis porque o fluxo está no final do arquivo, o valor é -1; while ((len = is.read (b))! = -1) {// converte a matriz de bytes em uma string usando o charset nomeado. String S = new String (B, 0, Len, "UTF-8"); SoapOfResult.Append (S); }} Conn.Disconnect (); Retornar SoapOfResult == NULL? null: SoapOfResult.toString (); } NOTA: O cliente está bloqueado após o envio da mensagem de solicitação SOAP. Até que o servidor retorne o código de status.
A seguir, a resposta do servidor (envelope de resposta SOAP):
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">-<S:Body>-<ns2:loginResponse xmlns:ns2="http://ujn.cn/"> <return>1</return></ns2:loginResponse> </s: corpo> </s: envelope>
Depois de receber os dados JSON enviados pelo servidor, o cliente executará operações de análise correspondentes. do seguinte modo:
// Analisar o protocolo SOAP (a análise DOM só pode ser usada para analisar os tipos de documentos XML, enquanto as mensagens SOAP estão no formato de dados XML) document Doc = xmlutil.string2doc (resultado); Elemento ele = (elemento) doc.getElementsByTagName ("return"). Item (0); O método string2doc () usado no método é o seguinte: Public Static Document String2Doc (String str) {// Analisar o documento XML em um documentBuilderFactory Factory = DocumentBuilderFactory.newinstance (); Documento documento = null; DocumentBuilder Build; if (str == null || str.equals ("")) {return null; } tente {inputStream Bais = new ByteArrayInputStream (str.getBytes ("utf-8")); Build = Factory.NewDocumentBuilder (); // analisa o conteúdo do InputStream fornecido como um documento XML e retorne um novo objeto Document Dom. document = build.parse (Bais); } catch (Exceção e) {e.printStackTrace (); } retornar documento; } De acordo com o resultado de retorno, o cliente executará processamento correspondente.
O exposto acima é o princípio básico de trabalho dos serviços da Web.
Obrigado pela leitura, espero que isso possa ajudá -lo. Obrigado pelo seu apoio a este site!