Al haber creado un cliente del servicio web java usando wsimport en un wsdl, necesito configurar el encabezado Authorization para cada mensaje soap incrustado en una solicitud http. Habiendo generado una subclase de javax.xml.ws.Service, ¿cómo puedo agregar un encabezado http a cada solicitud saliente?cliente del servicio web java, agregando encabezados http
Respuesta
Puede pasar un mapa con encabezados personalizados a BindingProvider (creo que puede establecer la propiedad MessageContext.HTTP_REQUEST_HEADERS). Intente crear un encabezado de Autorización y pasarlo.
Aquí está el código, basado en la respuesta de Femi.
Puede ser un poco difícil de entender. Funciona muy bien!
Service jaxwsService = Service.create(wsdlURL, serviceName);
Dispatch<SOAPMessage> disp = jaxwsService.createDispatch(portName, SOAPMessage.class, Service.Mode.MESSAGE);
//Add HTTP request Headers
Map<String, List<String>> requestHeaders = new HashMap<>();
requestHeaders.put("Auth-User", Arrays.asList("BILL_GATES"));
disp.getRequestContext().put(MessageContext.HTTP_REQUEST_HEADERS, requestHeaders);
Tengo problemas con la llamada createDispatch: Despacho
¡Gracias! Si eres tan tonto como yo, podrías intentar usar un 'Map
En aras de la exhaustividad y para ayudar a otros en situaciones similares, me gustaría ilustrar la solución más limpia en mi humilde opinión utilizando el manejador-WS-JAX-cadena:
1) Sub-clase de su service-class (no la clase port) en un paquete diferente (no generado). Debido a que es probable que la clase de servicio (y todo su paquete) se haya generado a partir de un WSDL, sus cambios en la subclase no se pierden cuando actualiza su clase de servicio después de un cambio WSDL.
2) Anotar su servicio-sub-clase como esta (importación javax.jws.HandlerChain
):
@HandlerChain(file="HandlerChain.xml")
public class MyService extends GeneratedService {
3) Crear un archivo llamado HandlerChain.xml
en el mismo paquete que el servicio de sub-clase, es decir, junto a MyService
con el siguiente contenido:
<?xml version="1.0" encoding="UTF-8"?>
<handler-chains xmlns="http://java.sun.com/xml/ns/javaee">
<handler-chain>
<handler>
<handler-name>co.codewizards.example.HttpHeaderExtensionSOAPHandler</handler-name>
<handler-class>co.codewizards.example.HttpHeaderExtensionSOAPHandler</handler-class>
</handler>
</handler-chain>
</handler-chains>
Usted puede agregar varios elementos <handler>
, por cierto.
¡Y asegúrese de que este archivo realmente termine en su JAR! Por ejemplo, cuando usa Maven, debe colocarlo en ${project}/src/main/resources/
(en lugar de ${project}/src/main/java/
) o tiene que cambiar su configuración de compilación para incluir recursos de la carpeta java
. Recomiendo este último, porque es engorroso tener una estructura de paquete paralela en la carpeta resources
, que a menudo se olvida durante las refactorizaciones.
4) Poner en práctica su HttpHeaderExtensionSOAPHandler
- similar a esto:
import static com.google.common.base.Preconditions.*;
import java.util.*;
import javax.xml.namespace.QName;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.soap.SOAPHandler;
import javax.xml.ws.handler.soap.SOAPMessageContext;
import co.codewizards.webservice.WebserviceContext;
public class HttpHeaderExtensionSOAPHandler implements SOAPHandler<SOAPMessageContext> {
@Override
public boolean handleMessage(SOAPMessageContext context) {
checkNotNull(context, "context");
Boolean outboundProperty = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
checkNotNull(outboundProperty, "outboundProperty");
if (outboundProperty.booleanValue()) {
WebserviceContext<?, ?> webserviceContext = WebserviceContext.getThreadWebserviceContextOrFail();
String something = (String) webserviceContext.___(); // my API method ;-)
@SuppressWarnings("unchecked")
Map<String, List<String>> requestHeaders = (Map<String, List<String>>) context.get(MessageContext.HTTP_REQUEST_HEADERS);
if (requestHeaders == null) {
requestHeaders = new HashMap<String, List<String>>();
context.put(MessageContext.HTTP_REQUEST_HEADERS, requestHeaders);
}
requestHeaders.put(MyService.MY_CONSTANT, Collections.singletonList(something));
}
return true;
}
@Override
public boolean handleFault(SOAPMessageContext context) { return true; }
@Override
public void close(MessageContext context) { }
@Override
public Set<QName> getHeaders() { return Collections.emptySet(); }
}
En mi ejemplo anterior (y en mi código productivo) I obtener los datos para ser introducidos en las cabeceras de petición HTTP de una ThreadLocale
, es decir, el contexto de mi hilo actual. Dado que este WebserviceContext
es mi clase personalizada, deberá implementar su propia forma de acceder a sus datos.
cuando se está enviando en el modo de mensaje, también puede pasar en MimeHeaders mensaje SOAP, lo que eventualmente se traducirán en las cabeceras HTTP, es decir:
soapMessage.getMimeHeaders().addHeader("Authorization","Basic [md5]")
- 1. agregando encabezados http en llamada al servicio SoapHttpClient
- 2. Agregar encabezados Http personalizados al proxy de servicio web
- 3. Error del cliente del servicio web CXF
- 4. cliente web para servicio web
- 5. Dominio cruzado AJAX del servicio REST encabezados HTTP
- 6. Cómo agregar un encabezado Http personalizado para el servicio web C# Cliente que consume el servicio web Axis 1.4
- 7. Java servicio web volviendo objeto nulo a un cliente .NET
- 8. Enviando encabezados HTTP con HTTP Web Request para autenticación NTLM
- 9. AXIS contra JAX-WS para el cliente del servicio web
- 10. ¿Cómo crear un cliente Java para el servicio web?
- 11. Cliente Java para el servicio web SOAP con autenticación NTLM
- 12. Cliente de servicio web Python
- 13. Llamar a un servicio web que requiere autenticación HTTP básica del cliente wcf
- 14. Herramienta para supervisar HTTP, TCP, etc. Tráfico del servicio web
- 15. Método de servicio web Java que recibe el argumento nulo del cliente C#
- 16. Agregando encabezados y datos de publicación en solicitud RESTfull/HTTP en C#
- 17. Agregando atributos a la entidad del cliente
- 18. Cómo: Servicio web y manejo de tiempos de espera del cliente en el servicio web?
- 19. servicio web asmx: autenticación de cliente
- 20. ¿Cómo configuro un cliente del servicio web C# para enviar el encabezado y el cuerpo de solicitud HTTP en paralelo?
- 21. Agregar encabezados SOAP para el servicio web HTTP Endpoint de SQL 2005 en Visual Studio 2008
- 22. ¿Longitud del contenido y otros encabezados HTTP?
- 23. Cliente del servicio web Java JAX-WS: cómo solicitar y responder el registro xml?
- 24. Compactar encabezados Http
- 25. Analizando encabezados HTTP
- 26. Cómo devolver los resultados del servicio web en java
- 27. Enviando encabezados http con python
- 28. Java Async Http clientes comparaciones
- 29. Cliente HTTP de Java para ElasticSearch
- 30. Error al usar Jax para generar el cliente del servicio web Proxy
[Esta entrada del blog] (http: // vangjee. wordpress.com/2009/02/25/how-to-modify-request-headers-in-a-j2ee-web-application/) muestra cómo modificar HttpRequestHeaders. Supone que estás escribiendo una aplicación J2EE. – Davidann