jaxws를 사용하여 웹 서비스 클라이언트를 구축하고 soap 메시지를 실현하는handler 검증 예시

프로젝트 수요로 이전에 사용했던 웹 서비스를 다시 주웠고, 이번에는 Jar 패키지가 필요 없는 Java 원생 Jaxws를 선택했다.우선 wsimport의 사용법, 먼저 나의 사용법을 공유합니다. cmd에서 프로젝트가 있는 경로로 이동한 다음 다음 명령을 실행합니다.

wsimport -keep -extension -s ./src -p com.jaxws.test http://192.168.1.1:8080/service?wsdl
com에 있습니다.jaxws.테스트 패키지 아래에서 자동으로 생성된 각종 클라이언트 관련 보조 클래스를 찾을 수 있습니다.이런 종류를 어떻게 쓰는지 자세히 말하지 마라, 인터넷에는 많은 자료가 있다.그 다음은 호출 클래스를 직접 작성하는 것입니다. (저는 단지 하나의 방법일 뿐입니다. 호출되면 됩니다.)

public String jaxws(Object[] opArgs)
{
    ServicesService service=new ServicesService();

    // SOAP
    service.setHandlerResolver(new HandlerResolver(){
        public List<Handler> getHandlerChain(PortInfo portInfo) {
            List<Handler> handlerList = new ArrayList<Handler>();
            //
            handlerList.add(new ClientHandler());
            return handlerList;
        }
    });

    String result =service.getServicesPort().getResults(opArgs.toString());
    //
    System.out.println(result);
    return result;
}
여기의 [//인증 정보 추가handlerList.add(new ClientHandler();]를 참고하십시오.그래서 우리는 인증 메시지를 조립하기 위해 클라이언트 Handler 클래스를 새로 만들어야 한다. 다음과 같다.

package com.jaxws.test;

import java.util.Set;
import javax.xml.namespace.QName;
import javax.xml.soap.*;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.soap.SOAPHandler;
import javax.xml.ws.handler.soap.SOAPMessageContext;

public class ClientHandler implements SOAPHandler<SOAPMessageContext> {

    public boolean handleMessage(SOAPMessageContext ctx) {

    // , ,
    Boolean request_p=(Boolean)ctx.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
    if(request_p){
        try {
            SOAPMessage msg=ctx.getMessage();
            SOAPEnvelope env=msg.getSOAPPart().getEnvelope();
            SOAPHeader hdr=env.getHeader();
            if(hdr==null) hdr=env.addHeader();

            //

            //QName(String namespaceURI, String localPart, String prefix)
            //QName(String namespaceURI, String localPart)
            //QName(String localPart)
            //@param namespaceURI:QName
            //@param localPart:QName
            //@param prefix:QName
            QName name=new QName("http://csdc.info/", "Authentication", "wsse");
            SOAPHeaderElement header = hdr.addHeaderElement(name);

            //addChildElement(String localName, String prefix,String uri)
            //addChildElement(String localName, String prefix)
            //addChildElement(String localName)
            //@param uri: URI
            //@param localName:
            //@param prefix:
            // JDK 1.6 API
            SOAPElement userElement = header.addChildElement("Username", "wsse");
            userElement.addTextNode("admin");
            SOAPElement passElement = header.addChildElement("Password", "wsse");
            passElement.addTextNode("admin");

            msg.saveChanges();

            // SOAP System.out,
            msg.writeTo(System.out);

            return true;   
        } catch (Exception e) {   
           e.printStackTrace();   
        }
    }   
    return false;   
    }

    @Override
    public boolean handleFault(SOAPMessageContext context) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public void close(MessageContext context) {
        // TODO Auto-generated method stub       
    }

    @Override
    public Set<QName> getHeaders() {
        // TODO Auto-generated method stub
        return null;
    }
}
이 종류는 모든 soap 메시지를 하나의 헤더 메시지로 추가했습니다. 여기 있는 헤더 메시지는 다음과 같습니다

<wsse:Authentication xmlns:wsse="http://csdc.info/">
    <wsse:Username>admin</wsse:Username>
    <wsse:Password>admin</wsse:Password>
</wsse:Authentication>
이렇게 하면 soap 헤드 인증을 가진 jaxws 기반의 웹 서비스 클라이언트를 실현할 수 있다.

좋은 웹페이지 즐겨찾기