我正在处理网络服务。我想知道如何在JAX-WS类型的Web服务中向SOAP请求添加标头。
考虑我的标题。
Map<String, List<String>> headers = new HashMap<String, List<String>>();
headers.put("Username", Collections.singletonList("aaaa"));
headers.put("Password", Collections.singletonList("aaaa"));
我的客户端类中有stub对象。我正在使用Apache Axis 2.所有类都是自动生成的。
SimpleSTub stub = new Simplestub();
我想在客户端添加此标头信息。
MessageContext.HTTP_REQUEST_HEADERS, headers
修改
普通类中的实际实现,发现为
private static final String WS_URL =“http:// localhost:9999 / ws / hello?wsdl”;
public static void main(String [] args)抛出异常{
网址url =新网址(WS_URL); QName qname = new QName(“http://ws.mkyong.com/”,“HelloWorldImplService”);
Service service = Service.create(url, qname);
HelloWorld hello = service.getPort(HelloWorld.class);
/*******************UserName & Password ******************************/
Map<String, Object> req_ctx = ((BindingProvider)hello).getRequestContext();
req_ctx.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, WS_URL);
Map<String, List<String>> headers = new HashMap<String, List<String>>();
headers.put("Username", Collections.singletonList("mkyong"));
headers.put("Password", Collections.singletonList("password"));
req_ctx.put(MessageContext.HTTP_REQUEST_HEADERS, headers);
/**********************************************************************/
System.out.println(hello.getHelloWorldAsString());
任何人都可以告诉你如何实现这一点。
感谢。
答案 0 :(得分:10)
您已经拥有了已有的解决方案。实现这一目标的最基本方法是
在您的客户代码中,通过MessageContext
BindingProvider
获取对SimpleStub
的引用
Map<String,Object> context = ((BindingProvder)stub).getRequestContext()
Map<String,List> headers = context.get(MessageContext.HTTP_REQUEST_HEADERS)
更新地图并将其填充回请求上下文对象
context.put(MessageContext.HTTP_REQUEST_HEADERS,headers)
以上一切都很好。但是,如果您尝试执行我认为添加身份验证参数的操作,建议的方法是
context.put(BindingProvder.USERNAME_PROPERTY,"username");
context.put(BindingProvder.PASSWORD_PROPERTY,"password");