Estoy tratando de llamar a un servicio web de SOAP mediante controladores con autorización básica pero de alguna manera API está respondiendo con 401 no autorizado.
@Override
public boolean handleMessage(SOAPMessageContext context) {
Boolean outboundProperty = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
if (outboundProperty.booleanValue()) {
String authString = parameter.getUser() + ":" + parameter.getPassword();
try {
Map<String, List<String>> headers = (Map<String, List<String>>)
context.get(MessageContext.HTTP_REQUEST_HEADERS);
if (null == headers) {
headers = new HashMap<String, List<String>>();
}
headers.put("Authorization", Collections.singletonList(
"Basic " + new String(Base64.encode(authString.getBytes()))));
} catch(Exception e) {
log4j.error(e.getMessage(), e);
}
}
return outboundProperty;
}
Cuando uso de SOAP UI y manualmente agregar el encabezado Authorziation (valor de código durante la depuración), entonces la respuesta que recibo desde el punto final, pero utilizando el código de falla a partir de ahora.
Cualquier indicador sería de gran ayuda. Gracias
Usted tendría que cambiar el código de la siguiente manera:
@Override
public boolean handleMessage(SOAPMessageContext context) {
Boolean outboundProperty = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
if(outboundProperty.booleanValue()){
try{
String authString = parameter.getUser() + ":" + parameter.getPassword();
SOAPMessage soapMessage =context.getMessage();
String authorization = new sun.misc.BASE64Encoder().encode(authString.getBytes());
soapMessage.getMimeHeaders().addHeader("Authorization","Basic " + authorization);
soapMessage.saveChanges();
}catch(Exception e){
log4j.error(e.getMessage(), e);
}
}
return true;
}
Actualizado:
Como se explica aquí se debe utilizar Base64Coder
a partir sun.misc.BASE64Encoder()
de la codificaciónauthString
Además siempre hay que volver true
a partir de este método de lo contrario se bloquean el procesamiento de la cadena de controlador de solicitudes mediante la devolución false
.