Как сгенерировать UsernameToken для запроса SOAP?

Я хочу сгенерировать «UsernameToken-28FE7B32CCC1AB2B22141113557641136»> в Java, чтобы отправить запрос в веб-службу SOAP. Использовать 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>

person Dark Soul    schedule 19.09.2014    source источник
comment
В этом посте есть информация. Посмотрите, поможет ли это вам: stackoverflow.com/questions/14435580 /   -  person edubriguenti    schedule 22.09.2014


Ответы (1)


Как в Добавить wsse:UsernameToken в заголовок мыла

Вы можете добавить 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 из файла 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;
}
person edubriguenti    schedule 25.09.2014
comment
спасибо, так что с этим, я должен удалить строку из моего запроса, где я отправляю токен, имя пользователя и пароль? и ваш код добавит токен, пользователя и пароль к запросу? - person Dark Soul; 25.09.2014
comment
Если у вас уже есть сообщение в строке, вы должны сначала создать SoapMessage из строки, а затем изменить нужные свойства. Я добавил немного информации. - person edubriguenti; 25.09.2014