Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何为SOAP请求生成UsernameToken?_Java_Web Services_Soap_Wss4j_Usernametoken - Fatal编程技术网

Java 如何为SOAP请求生成UsernameToken?

Java 如何为SOAP请求生成UsernameToken?,java,web-services,soap,wss4j,usernametoken,Java,Web Services,Soap,Wss4j,Usernametoken,我想用Java生成“UsernameToken-28FE7B32CC1AB2B2214113557641136”>以便向SOAP web服务发送请求。使用SoapUI和请求很容易,因为它将自动生成,但如何在java中实现这一点?我当前正在从外部文件发送请求,如何从Java执行此操作并自动生成UsernameToken 这是我的密码: public class SampleHttpClient { public static String invokeWebService(String web

我想用Java生成“UsernameToken-28FE7B32CC1AB2B2214113557641136”>以便向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();

}
}
}
以及调用EWS代码:

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请求(针对安全问题进行了修改):


用户名密码=gt/swtwet/ww==2014-09-19T14:22:56.411Z
31045243
545345
1234124
如中所示

您可以通过以下方式将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);

已编辑


如果消息已包含在字符串中,则应首先从
字符串创建
SoapMessage
对象

使用以下方法:

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;
}

这篇文章中有一些信息。看看它是否对您有帮助:谢谢,那么,我是否应该删除请求中发送令牌、用户名和密码的行?您的代码将向请求添加令牌、user和pass?如果您已经拥有字符串形式的消息,则应首先从该字符串创建SoapMessage,然后更改所需的属性。我添加了一些信息。
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;
}