【问题标题】:how add Message context headers to apache axis 2 Java如何将消息上下文标头添加到 apache 轴 2 Java
【发布时间】:2012-12-23 09:52:29
【问题描述】:

我正在开发网络服务。我想知道如何在 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"));

我的客户端类中有存根对象。我使用的是 Apache Axis 2。所有的类都是自动生成的。

SimpleSTub stub = new Simplestub();

我想在客户端添加这个头信息。

MessageContext.HTTP_REQUEST_HEADERS, headers

编辑

普通类中的实际实现为

私有静态最终字符串 WS_URL = "http://localhost:9999/ws/hello?wsdl";

public static void main(String[] args) 抛出异常 {

URL url = 新 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());

谁能告诉我如何做到这一点。

谢谢。

【问题讨论】:

    标签: java web-services jax-ws axis2 webservice-client


    【解决方案1】:

    您正在用已有的东西找到解决方案。实现这一点的最基本方法是

    1. 在您的客户端代码中,通过您的SimpleStub 上的BindingProvider 获取对MessageContext 的引用

      Map<String,Object> context = ((BindingProvder)stub).getRequestContext()
      Map<String,List> headers = context.get(MessageContext.HTTP_REQUEST_HEADERS)
      
    2. 更新地图并将其填回到请求上下文对象中

      context.put(MessageContext.HTTP_REQUEST_HEADERS,headers)
      

      以上都很好。但是,如果您尝试执行我认为添加身份验证参数的操作,则推荐的方法是

      context.put(BindingProvder.USERNAME_PROPERTY,"username");
      context.put(BindingProvder.PASSWORD_PROPERTY,"password");   
      

    【讨论】:

    • 感谢您的解决方案。如果您也能告诉我在服务类中访问它的方法,那就太好了。
    • @User222,查看this answer 并将“响应”替换为请求。不过,还有其他方法可以在服务 bean 中完成。如果上面的回答解决了问题,请不要忘记接受它
    • 我收到异常,因为无法将存根类型强制转换为 BindingPort。我已经编辑了这个问题。请检查。
    • 再次感谢您的回复。我认为存根需要替换为 hello 变量。但我不知道如何从存根中获取它。
    • @User222,我在这里有点困惑。你究竟处于这个发展的哪个阶段?您是否能够与 Web 服务进行通信?您在问题中所做的代码编辑,您是否实际运行过它并且它有效?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-02
    • 2022-08-11
    • 1970-01-01
    • 2018-08-02
    相关资源
    最近更新 更多