使用 JAX-WS 发送传输头

您可以启用现有的 Java™ API for XML-Based Web Services (JAX-WS) Web Service 客户机以使用传输头来发送应用程序定义的信息以及 Web Service 请求。此外,您可以启用 JAX-WS Web Service 端点以使用传输头来发送应用程序定义的信息以及 Web Service 响应消息。

开始之前

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

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

关于此任务

使用 JAX-WS 编程模型时,客户机必须在 BindingProvider 的 RequestContext 对象上设置一个属性以使用 Web Service 请求消息在传输头中发送值。设置属性后,将在针对 BindingProvider 对象的后续远程方法调用的所有请求中设置值,直到关联的属性设置为 null 或废弃 BindingProvider 对象为止。

要在来自 JAX-WS Web Service 客户机的出站请求上的传输头中发送值,请按如下所示来修改客户机代码:

过程

  1. 创建包含传输头的 java.util.Map 对象。
  2. 对于您要让客户机发送的每一个传输头,请向 Map 对象添加一个条目。
    1. 将 Map 条目键设置成与传输头标识完全匹配的字符串。 可以使用保留的头名称定义头标识(例如,如果是 HTTP,那么使用 Cookie),也可以由用户定义头标识(例如,MyTransportHeader)。某些头标识以特定的方式处理,但是就像处理头标识值一样,不会执行其他检查。要了解具有特殊考虑事项的 HTTP 头标识的更多信息,请阅读“传输头属性最佳实践”的相关信息。可以在 com.ibm.websphere.webservices.Constants 类中找到公共头标识字符串常量(例如 HTTP_HEADER_SET_COOKIE)。
    2. 将 Map 条目值设置成传输头的值。 此值的类型可以是下列其中一种数据类型:
      • java.lang.String
      • java.lang.Integer
      • java.lang.Short
      • java.lang.Long
      • java.lang.Float
      • java.lang.Double
      • java.lang.Byte
      • java.lang.Boolean
  3. 使用 com.ibm.websphere.webservices.Constants.REQUEST_TRANSPORT_PROPERTIES 属性在 BindingProvider 的 RequestContext 上设置 Map 对象。 当设置 REQUEST_TRANSPORT_PROPERTIES 属性值时,将在后续调用时使用该 Map 以设置出局请求中的值。如果将 REQUEST_TRANSPORT_PROPERTIES 属性值设置为 null,那么在出局请求中,将不发送任何传输属性。要了解有关这些属性的更多信息,请参阅传输头属性文档。
  4. 针对 BindingProvider 实例发出远程方法调用。 对于每一种方法调用,都会将 Map 中的头及相关联的值添加到出局请求。如果调用使用 HTTP,那么传输头将作为 HTTP 头在 HTTP 请求中发送。如果调用使用 JMS,那么传输头将作为 JMS 消息属性进行发送。
    如果未正确设置 Constants.REQUEST_TRANSPORT_PROPERTIES 属性,那么您可能会遇到 API 用法错误,该错误会导致 WebServiceException 错误。必须满足以下需求,否则进程将失败:
    1. 在 BindingProvider 的 RequestContext 上设置的 Constants.REQUEST_TRANSPORT_PROPERTIES 属性值必须是 java.util.Map 对象或 null
    2. Map 中的每一个键都必须是 java.util.String 数据类型。
    3. Map 中的每一个值都必须是下列其中一种数据类型:
      • java.lang.String
      • java.lang.Integer
      • java.lang.Short
      • java.lang.Long
      • java.lang.Float
      • java.lang.Double
      • java.lang.Byte
      • java.lang.Boolean

结果

您具有已配置成在 Web Service 请求消息中发送传输头的 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 send transport headers on the request.
    public void invokeService() {

        // Set up the Map that will contain the request headers.
        Map<String, Object> requestHeaders = new HashMap<String, Object>();
        requestHeaders.put(“MyHeader1”, “This is a string value”);
        requestHeaders.put(“MyHeader2”, new Integer(33));
        requestHeaders.put(“MyHeader3”, new Boolean(true));

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

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

从 JAX-WS 端点发送响应传输头

开始之前

您需要 JAX-WS Web Service 端点实现类,您可以启用该实现类以发送传输头。

从 JAX-WS 端点发送响应传输头与从 JAX-WS 客户机发送请求传输头类似。它受 HTTP 和 JMS 传输的支持。

关于此任务

使用 JAX-WS 编程模型时,端点实现类必须在 MessageContext 上设置一个属性以使用 Web Service 响应消息在传输头中发送值。

过程

  1. 创建包含传输头的 java.util.Map 对象。
  2. 对于您要在响应消息中发送的每一个传输头,请向 Map 对象添加一个条目(键和值)。 这类似于客户机的前一过程。
  3. 检索与端点的调用相关联的 MessageContext(javax.xml.ws.handler.MessageContext 的实例)。
  4. 使用 com.ibm.websphere.webservices.Constants.RESPONSE_TRANSPORT_PROPERTIES 属性在 MessageContext 上设置 Map 对象。

结果

您具有已配置成在 Web Service 响应消息中发送传输头的 JAX-WS Web Service 端点实现类。

示例

以下是一个简短编程示例,该示例说明了如何通过 JAX-WS Web Service 端点实现类来发送响应传输头:
@WebService
public class EchoServiceImpl implements EchoServicePortType {

    // Inject an instance of WebServiceContext so we can retrieve
    // the MessageContext for each invocation of this endpoint.
    @Resource
    WebServiceContext ctxt;

    /**
     * Default constructor.
     */
    public EchoServiceImpl() {
        ....
    }

    public String echoString(String input) {
        String result = “Echo result: “ + input;

        // Retrieve the MessageContext from the injected WebServiceContext.
        MessageContext mc = ctxt.getMessageContext();

        // Send some headers back in the response message.
        Map<String, Object> responseHeaders = new HashMap<String, Object>();
        responseHeaders.put("MyHeader1", "This is a string response value");
        responseHeaders.put("MyHeader2", new Integer(33));
        responseHeaders.put("MyHeader3”, new Boolean(false));

        // Set the response header Map on the MessageContext.
        mc.put(com.ibm.websphere.webservices.Constants.RESPONSE_TRANSPORT_PROPERTIES, responseHeaders);

        return result;
    }
}

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



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