使用 JAX-WS 检索传输头

可以使 Java™ API for XML-Based Web Services (JAX-WS) Web Service 客户机从传输头检索值。对于使用 HTTP 的请求,从 HTTP 响应消息中找到的 HTTP 头检索传输头。对于使用 Java 消息服务 (JMS) 的请求,将从 JMS 响应消息上找到的 JMS 消息属性检索传输头。

开始之前

您需要 JAX-WS Web Service 客户机,您可以启用该客户机以检索传输头。

只有 Web Service 客户机支持检索传输头,并且支持通过 HTTP 和 JMS 传输进行检索。Web Service 客户机必须直接调用 JAX-WS API,而不是通过任意层(例如,网关功能)进行调用。

关于此任务

使用 JAX-WS 编程模型时,客户机必须在 BindingProvider 的 RequestContext 对象上设置属性以便从传输头检索值。 设置属性后,将从针对该 BindingProvider 对象的后续方法调用的响应中读取值,直到关联的属性设置为 null 或废弃 BindingProvider 对象为止。

要从入站响应上的传输头检索值,请按照以下所示来修改客户机代码:

过程

  1. 创建将用于存放从响应消息检索到的传输头的 java.util.Map 对象。 要从响应消息检索所有传输头,请将此 Map 留空。
  2. (可选)对于要从入局响应消息进行检索的每个头,向 Map 添加一个条目。
    1. 将 Map 条目键设置成与传输头标识完全匹配的字符串。 可以使用保留的头名称指定头标识(例如,如果是 HTTP,请使用 Cookie),也可以由用户定义头标识(例如,MyTransportHeader)。某些头标识以特定的方式处理,但是不执行其他检查来确认头标识值。要了解具有特殊考虑事项的 HTTP 头标识的更多信息,请阅读“传输头属性最佳实践”的相关信息。可以在 com.ibm.websphere.webservices.Constants 类中找到公共头标识字符串常量(例如 HTTP_HEADER_SET_COOKIE)。Map 条目值被忽略且不需要设置。空的 Map(例如,非 null 但是不包含任何密钥的 HashMap)将导致检索响应中的所有传输头。
  3. 使用 com.ibm.websphere.webservices.Constants.RESPONSE_TRANSPORT_PROPERTIES 属性在 BindingProvider 的 RequestContext 上设置 Map 对象。 设置 Map 时,在后续调用中使用 RESPONSE_TRANSPORT_PROPERTIES 属性从响应中检索头。如果将该属性设置为 null,那么不会从响应中检索任何头。要了解有关这些属性的更多信息,请参阅传输头属性文档。
  4. 对 BindingProvider 实例调用远程方法调用。 将从响应消息检索指定的传输头中的值并将这些值放在 Map 中。
    如果未正确设置此属性,那么您可能会遇到导致 WebServiceException 错误的 API 使用错误。必须满足以下需求,否则进程将失败:
    • 在 BindingProvider 的 RequestContext 实例上设置的 Constants.RESPONSE_TRANSPORT_PROPERTIES 属性值必须是 null 或 java.util.Map 的实例。
    • 所有 Map 密钥必须是 java.lang.String 数据类型,密钥不得为 null。
    • Map 可能为空,这表示它根本不含任何条目。在这种情况下,将从响应消息检索所有传输头。

结果

您具有可从入局响应消息接收传输头的 JAX-WS Web Service。

示例

以下是一个简短编程示例,该示例说明了如何通过 JAX-WS Web Service 客户机应用程序来检索响应传输头:
public class MyApplicationClass {
    // Inject an instance of the service's port-type.
    @WebServiceRef(EchoService.class)
    private EchoPortType port;

    // This method will invoke  the web service operation and retrieve transport headers on the request.
    public void invokeService() {

        // Set up the Map to retrieive our response headers.
        Map<String, Object> responseHeaders = new HashMap<String, Object>;
        responseHeaders.put(“MyHeader1”, null);
        responseHeaders.put(“MyHeader2”, null);
        responseHeaders.put(“MyHeader3”, null);

        // Set the Map as a property on the RequestContext.
        BindingProvider bp = (BindingProvider) port;
        bp.getRequestContext().put(com.ibm.websphere.webservices.Constants.RESPONSE_TRANSPORT_PROPERTIES, responseHeaders);

        // Invoke the web services operation.
        String result = port.echoString(“Hello, world!”);

        // Now retrieve our response headers.
        Object header1 = responseHeaders.get(“MyHeader1”);
        Object header2 = responseHeaders.get(“MyHeader2”);
        Object header3 = responseHeaders.get(“MyHeader3”);

    }
}

指示主题类型的图标 任务主题



时间戳记图标 最近一次更新时间: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=twbs_retrievecookiejaxws
文件名:twbs_retrievecookiejaxws.html