gpt4 book ai didi

java - 使用 SOAP WS 返回错误 401 未经授权

转载 作者:行者123 更新时间:2023-12-01 21:40:47 25 4
gpt4 key购买 nike

我正在尝试使用 spring-ws 来使用 SOAP Web 服务。我能够从 SOAP UI 成功使用此 Web 服务。但是我收到未经授权的异常:

org.springframework.ws.client.WebServiceTransportException: Unauthorized [401]
at org.springframework.ws.client.core.WebServiceTemplate.handleError(WebServiceTemplate.java:699)

如何成功进行身份验证?

我的代码如下:

WebServiceTemplate配置:

@Bean
public WebServiceTemplate webServiceTemplate(Jaxb2Marshaller marshaller){
WebServiceTemplate webServiceTemplate = new WebServiceTemplate();
webServiceTemplate.setDefaultUri("http://ultron.illovo.net:9704/AdminService");
webServiceTemplate.setMarshaller(marshaller);
webServiceTemplate.setUnmarshaller(marshaller);

Credentials credentials = new UsernamePasswordCredentials("biqa", "welcome1");

HttpComponentsMessageSender messageSender = new HttpComponentsMessageSender();
messageSender.setCredentials(credentials);
messageSender.setReadTimeout(5000);
messageSender.setConnectionTimeout(5000);
webServiceTemplate.setMessageSender(messageSender);

return webServiceTemplate;
}

客户:

@Autowired

WebServiceTemplate webServiceTemplate;

public CallProcedureWithResultsResponse callProcedureWithResults(String procedureName){
CallProcedureWithResults request = new CallProcedureWithResults();
request.setProcedureName(procedureName);
log.info("Calling procedure " + procedureName);

CallProcedureWithResultsResponse response = (CallProcedureWithResultsResponse) webServiceTemplate.marshalSendAndReceive("http://ultron.illovo.net:9704/AdminService/AdminService", request);

return response;
}

JUnit 测试

@Test
public void testWebService(){
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ObieeConfiguration.class);
ObieeClient client = context.getBean(ObieeClient.class);
CallProcedureWithResultsResponse response = client.callProcedureWithResults("GetOBISVersion()");
client.printResponse(response);
context.close();
}

最佳答案

我通过执行以下操作成功解决了此问题:

创建 HttpUrlConnectionMessageSender 的子类,如下所示:

public class WebServiceMessageSenderWithAuth extends HttpUrlConnectionMessageSender {

String user;
String password;

public WebServiceMessageSenderWithAuth(String user, String password) {
this.user = user;
this.password = password;
}

@Override
protected void prepareConnection(HttpURLConnection connection) throws IOException {
BASE64Encoder enc = new BASE64Encoder();
String userpassword = user+":"+password;
String encodedAuthorization = enc.encode( userpassword.getBytes() );
connection.setRequestProperty("Authorization", "Basic " + encodedAuthorization);
super.prepareConnection(connection);
}

}

我的客户端定义如下:

public class ObieeClient extends WebServiceGatewaySupport {

private static final Logger log = LoggerFactory.getLogger(ObieeClient.class);

public CallProcedureWithResultsResponse callProcedureWithResults(String procedureName, String webServiceURL){
CallProcedureWithResults request = new CallProcedureWithResults();
request.setProcedureName(procedureName);
log.info("Calling procedure " + procedureName);

CallProcedureWithResultsResponse response = (CallProcedureWithResultsResponse) ((JAXBElement) getWebServiceTemplate().marshalSendAndReceive(webServiceURL, request)).getValue();

return response;
}
}

最后,通过设置消息发送者将客户端配置为使用凭据:

     Jaxb2Marshaller marshaller = new Jaxb2Marshaller();            marshaller.setContextPath("za.co.adaptit.smartdeployment.webservices.wsdl");

//set up web service client
ObieeClient client = new ObieeClient();
client.setDefaultUri(host);
client.setMarshaller(marshaller);
client.setUnmarshaller(marshaller);
client.setMessageSender(new WebServiceMessageSenderWithAuth("user", "password"));

response = client.callProcedureWithResults("NQSModifyMetadata('" + obieeObjectsXML +"')", server.getHost());

希望这有帮助。

关于java - 使用 SOAP WS 返回错误 401 未经授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36496163/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com