我想生成" UsernameToken-28FE7B32CCC1AB2B22141113557641136">在Java中为了向SOAP Web服务发送请求。使用SoapUI和请求很容易,因为它会自动生成,但我怎么能在java中这样做?我目前正在从外部文件发送请求,如何从Java执行此操作并自动生成UsernameToken?
这是我的代码:
public class SampleHttpClient
{
public static String invokeWebService(String webServiceURL,
String requestXMLPath)
throws FileNotFoundException, Exception
{
PostMethod post = null;
HttpClient client = new HttpClient();
try
{
// Read the SOAP request from the file
StringBuffer requestFileContents = new StringBuffer();
BufferedReader bufferedReader = new BufferedReader(new FileReader(requestXMLPath));
String line = null;
while((line = bufferedReader.readLine()) != null)
{
requestFileContents.append(line);
}
post = new PostMethod(webServiceURL);
post.setRequestHeader("Accept","application/soap+xml,application/dime,multipart/related,text/*");
post.setRequestHeader("SOAPAction", "");
// Request content will be retrieved directly from the input stream
RequestEntity entity = new StringRequestEntity(requestFileContents.toString(), "text/xml", "UTF-8");
post.setRequestEntity(entity);
// Returns a number indicating the status of response
int result = client.executeMethod(post);
String response = post.getResponseBodyAsString();
//bufferedReader.close();
return response;
}
finally
{
// Release current connection to the connection pool once you are done
post.releaseConnection();
}
}
}
和invokeWS代码:
public class SampleTest extends TestCase
{
public void test() throws FileNotFoundException, Exception
{
// Web service URL #1
final String wsURL = "http://webservice";
// Request XML path
final String requestXMLPath = "C:\\request.txt";
//Invoke the Web service #1
String webServiceResponse = SampleHttpClient.invokeWebService(wsURL,requestXMLPath);
System.out.println("Response #1: " + webServiceResponse);
}
}
以下是XML请求(针对安全问题进行了修改):
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:v2="http://webservice">
<soapenv:Header><wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"><wsse:UsernameToken wsu:Id="UsernameToken-28FC7B32CCC1BB2B21141113657641136"><wsse:Username>username</wsse:Username><wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">password=</wsse:Password><wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">gt/swtwet/ww==</wsse:Nonce><wsu:Created>2014-09-19T14:22:56.411Z</wsu:Created></wsse:UsernameToken></wsse:Security></soapenv:Header>
<soapenv:Body>
<v2:getThis1>
<v2:getThis12>
<v3:getThis13>
<v3:getThis10>
<v31:Id>31045243</v31:Id>
<v31:getThis1222>545345</v31:getThis1222>
</v3:getThis10>
<v3:Number>1234124</v3:Number>
</v3:getThis14323>
</v2:getThis1343>
</v2:getThis112>
</soapenv:Body>
</soapenv:Envelope>
答案 0 :(得分:3)
与Add wsse:UsernameToken in soap header
一样您可以通过以下方式向邮件添加UsernameToken:
//create SOAP
SOAPConnectionFactory sfc = SOAPConnectionFactory.newInstance();
SOAPConnection connection = sfc.createConnection();
SOAPMessage soapMessage = MessageFactory.newInstance().createMessage();
SOAPPart soapPart = soapMessage.getSOAPPart();
SOAPEnvelope soapEnvelope = soapPart.getEnvelope();
SOAPBody soapBody = soapEnvelope.getBody();
SOAPElement Header = soapBody.addBodyElement(new QName("Header"));
//attribute
SOAPElement Security= Header.addChildElement(new QName("Security"));
SOAPElement UsernameToken= Security.addChildElement(new QName("UsernameToken"));
SOAPElement Username= UsernameToken.addChildElement(new QName("Username"));
SOAPElement Password= UsernameToken.addChildElement(new QName("Password"));
//enter the username and password
Username.addTextNode("username");
Password.addTextNode("password");
//send the soap and print out the result
URL endpoint = "http://localhost:8080/soap/getMessage?wsdl";
SOAPMessage response = connection.call(soapMessage, endpoint);
<强> EDITED 强>
如果您已在字符串中包含该消息,则应首先从SoapMessage
创建string
对象。
使用以下方法:
private SOAPMessage getSoapMessageFromString(String xml) throws SOAPException, IOException {
MessageFactory factory = MessageFactory.newInstance();
SOAPMessage message = factory.createMessage(new MimeHeaders(), new ByteArrayInputStream(xml.getBytes(Charset.forName("UTF-8"))));
return message;
}