简体   繁体   English

如何在 Java 中发送原始 SOAP 请求?

[英]How to send raw SOAP request in Java?

I need to send a raw SOAP request to server.我需要向服务器发送原始 SOAP 请求。 My request looks like我的请求看起来像

POST http://10.76.243.43:8080/registry/services/xds-iti18 HTTP/1.1
Accept-Encoding: gzip,deflate
Content-Type: application/soap+xml;charset=UTF-8
Content-Length: 6383
Host: 10.76.243.43:8080
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:urn="urn:oasis:names:tc:ebxml-regrep:xsd:query:3.0" xmlns:urn1="urn:oasis:names:tc:ebxml-regrep:xsd:rs:3.0" xmlns:urn2="urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0">
   <soap:Header/>
   <soap:Body>
      <urn:AdhocQueryRequest id="?" comment="?" federated="false" federation="?" startIndex="0" maxResults="-1">
         <!--Optional:-->
         <urn1:RequestSlotList>
            <!--Zero or more repetitions:-->
            <urn2:Slot name="?" slotType="?">
               <urn2:ValueList>
                  <urn2:Value>?</urn2:Value>
               </urn2:ValueList>
            </urn2:Slot>
         </urn1:RequestSlotList>
         <urn:ResponseOption returnType="RegistryObject" returnComposedObjects="false"/>
         <urn2:AdhocQuery id="?" home="?" lid="?" objectType="?" status="?">
            <!--Zero or more repetitions:-->
            <urn2:Slot name="?" slotType="?">
               <urn2:ValueList>
                  <urn2:Value>?</urn2:Value>
               </urn2:ValueList>
            </urn2:Slot>
            <!--Optional:-->
            <urn2:Name>
               <urn2:LocalizedString xml:lang="en-US" charset="UTF-8" value="?"/>
            </urn2:Name>
            <!--Optional:-->
            <urn2:Description>
               <urn2:LocalizedString xml:lang="en-US" charset="UTF-8" value="?"/>
            </urn2:Description>
            <!--Optional:-->
            <urn2:VersionInfo versionName="1.1" comment="?"/>
            <!--Zero or more repetitions:-->
            <urn2:Classification id="?" home="?" lid="?" objectType="?" status="?" classificationScheme="?" classifiedObject="?" classificationNode="?" nodeRepresentation="?">
               <!--Zero or more repetitions:-->
               <urn2:Slot name="?" slotType="?">
                  <urn2:ValueList>
                     <urn2:Value>?</urn2:Value>
                  </urn2:ValueList>
               </urn2:Slot>
               <!--Optional:-->
               <urn2:Name>
                  <urn2:LocalizedString xml:lang="en-US" charset="UTF-8" value="?"/>
               </urn2:Name>
               <!--Optional:-->
               <urn2:Description>
                  <urn2:LocalizedString xml:lang="en-US" charset="UTF-8" value="?"/>
               </urn2:Description>
               <!--Optional:-->
               <urn2:VersionInfo versionName="1.1" comment="?"/>
               <!--Zero or more repetitions:-->
               <urn2:Classification/>
               <!--Zero or more repetitions:-->
               <urn2:ExternalIdentifier id="?" home="?" lid="?" objectType="?" status="?" registryObject="?" identificationScheme="?" value="?">
                  <!--Zero or more repetitions:-->
                  <urn2:Slot name="?" slotType="?">
                     <urn2:ValueList>
                        <urn2:Value>?</urn2:Value>
                     </urn2:ValueList>
                  </urn2:Slot>
                  <!--Optional:-->
                  <urn2:Name>
                     <urn2:LocalizedString xml:lang="en-US" charset="UTF-8" value="?"/>
                  </urn2:Name>
                  <!--Optional:-->
                  <urn2:Description>
                     <urn2:LocalizedString xml:lang="en-US" charset="UTF-8" value="?"/>
                  </urn2:Description>
                  <!--Optional:-->
                  <urn2:VersionInfo versionName="1.1" comment="?"/>
                  <!--Zero or more repetitions:-->
                  <urn2:Classification/>
                  <!--Zero or more repetitions:-->
                  <urn2:ExternalIdentifier/>
               </urn2:ExternalIdentifier>
            </urn2:Classification>
            <!--Zero or more repetitions:-->
            <urn2:ExternalIdentifier id="?" home="?" lid="?" objectType="?" status="?" registryObject="?" identificationScheme="?" value="?">
               <!--Zero or more repetitions:-->
               <urn2:Slot name="?" slotType="?">
                  <urn2:ValueList>
                     <urn2:Value>?</urn2:Value>
                  </urn2:ValueList>
               </urn2:Slot>
               <!--Optional:-->
               <urn2:Name>
                  <urn2:LocalizedString xml:lang="en-US" charset="UTF-8" value="?"/>
               </urn2:Name>
               <!--Optional:-->
               <urn2:Description>
                  <urn2:LocalizedString xml:lang="en-US" charset="UTF-8" value="?"/>
               </urn2:Description>
               <!--Optional:-->
               <urn2:VersionInfo versionName="1.1" comment="?"/>
               <!--Zero or more repetitions:-->
               <urn2:Classification id="?" home="?" lid="?" objectType="?" status="?" classificationScheme="?" classifiedObject="?" classificationNode="?" nodeRepresentation="?">
                  <!--Zero or more repetitions:-->
                  <urn2:Slot name="?" slotType="?">
                     <urn2:ValueList>
                        <urn2:Value>?</urn2:Value>
                     </urn2:ValueList>
                  </urn2:Slot>
                  <!--Optional:-->
                  <urn2:Name>
                     <urn2:LocalizedString xml:lang="en-US" charset="UTF-8" value="?"/>
                  </urn2:Name>
                  <!--Optional:-->
                  <urn2:Description>
                     <urn2:LocalizedString xml:lang="en-US" charset="UTF-8" value="?"/>
                  </urn2:Description>
                  <!--Optional:-->
                  <urn2:VersionInfo versionName="1.1" comment="?"/>
                  <!--Zero or more repetitions:-->
                  <urn2:Classification/>
                  <!--Zero or more repetitions:-->
                  <urn2:ExternalIdentifier/>
               </urn2:Classification>
               <!--Zero or more repetitions:-->
               <urn2:ExternalIdentifier/>
            </urn2:ExternalIdentifier>
            <!--Optional:-->
            <urn2:QueryExpression queryLanguage="?">
               e
               <!--You may enter ANY elements at this point-->
               gero
            </urn2:QueryExpression>
         </urn2:AdhocQuery>
      </urn:AdhocQueryRequest>
   </soap:Body>
</soap:Envelope>

It is standard raw request generated by SOAP UI (using wsdl of web service), so if I send it there I get HTTP code 200 and some normal response.它是由 SOAP UI(使用 Web 服务的 wsdl)生成的标准原始请求,所以如果我将它发送到那里,我会得到 HTTP 代码 200 和一些正常响应。 I want to send it using Java, so I do the following我想使用 Java 发送它,所以我执行以下操作

byte[] encoded = Files.readAllBytes(Paths.get("C:\\Users\\timofb\\Documents\\testtest.txt"));//file with my raw request
String soapXml = new String(encoded, StandardCharsets.UTF_8);
Socket socket = new Socket("10.76.243.43", 8080);
BufferedWriter out = new BufferedWriter(
            new OutputStreamWriter(socket.getOutputStream(), "UTF8"));
BufferedReader in = new BufferedReader(
            new InputStreamReader(socket.getInputStream()));
out.write(soapXml);
out.flush();
System.out.println("\n * Response");    
String line;
while ((line = in.readLine()) != null) {
     System.out.println(line);
}
in.close();

I get HTTP status 500 and SOAP message that Fault occurred while processing.我收到 HTTP 状态 500 和处理时发生错误的 SOAP 消息。 Thanks.谢谢。

Can you try like this: you need to replace the xmldata with yours:你可以这样尝试:你需要用你的替换xmldata:

   try {
        String xmldata = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><soapenv:Envelopey> your reuest</soapenv:Envelope>";
        String hostname = "10.76.243.43";
        int port = 8080;
        InetAddress addr = InetAddress.getByName(hostname);
        Socket sock = new Socket(addr, port);

        //Send header
        String path = "registry/services/xds-iti18";
        BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream(), "UTF-8"));
        wr.write("POST "+path + " HTTP/1.1\r\n");
        wr.write("Host: "+hostname+":"+port+"\r\n");
        wr.write("Content-Length: "+ xmldata.length() + "\r\n");
        wr.write("Content-Type: application/soap+xml; charset=\"utf-8\"\r\n");
        wr.write("\r\n");            //Send data
        wr.write(xmldata);
        wr.flush();

        // Response
        BufferedReader rd = new BufferedReader(new InputStreamReader(sock.getInputStream()));
        String line;
        while ((line = rd.readLine()) != null) {
          System.out.println("Response:"+line);
        }
} catch (Exception e) {
   e.printStackTrace();
}

I've found an answer.我找到了答案。 This code worked for me这段代码对我有用

    byte[] encoded = Files.readAllBytes(Paths.get("C:\\Users\\timofb\\Documents\\test.txt"));
    String soapXml = new String(encoded, StandardCharsets.UTF_8);
    SOAPConnectionFactory soapConnectionFactory =
            SOAPConnectionFactory.newInstance();
    java.net.URL endpoint = new URL("http://" + ip + "/cs-repository/services/xds-iti41");
    SOAPConnection connection = soapConnectionFactory.createConnection();
    MessageFactory factory = MessageFactory.newInstance();
    SOAPMessage message = factory.createMessage(new MimeHeaders(), new ByteArrayInputStream(encoded));
    AttachmentPart attachment = message.createAttachmentPart();
    attachment.setContent("sm_content", "text/plain");
    attachment.setContentId("1.9f910338bf0cac0e783bfdec7e53be9237684caa8f8f4e6d@apache.org");
    message.addAttachmentPart(attachment);
    SOAPMessage response = connection.call(message, endpoint);
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    response.writeTo(out);
    String strMsg = new String(out.toByteArray());
    return strMsg;

I know that It's a little bit late, but Unirest saved me a lot.我知道这有点晚了,但 Unirest 救了我很多。

You should simply try something like:您应该简单地尝试以下操作:

        Unirest.setTimeouts(0, 0);
        HttpResponse<String> response = Unirest.post("YOUR URL OPERATION")
          .header("Content-Type", "application/soap+xml")
          .body("YOUR RAW FILE")
          .asString();

Instead of socket you can use java HttpURLConnection, Here you must have set SOAPAction header attribute properly in you case it is "AdhocQueryRequest" or you can cross check from your wsdl, below is tentative untested code.您可以使用 java HttpURLConnection 代替套接字,在这里您必须正确设置 SOAPAction 标头属性,以防它是“AdhocQueryRequest”,或者您可以从您的 wsdl 进行交叉检查,以下是未经测试的暂定代码。

    URL url = new URL(SOAPUrl);
    URLConnection connection = url.openConnection();
    HttpURLConnection httpConn = (HttpURLConnection) connection;
    FileInputStream fin = new FileInputStream(xmlFile2Send);

    ByteArrayOutputStream bout = new ByteArrayOutputStream();

    // Copy the SOAP file to the open connection.
    copy(fin,bout);
    fin.close();

    byte[] b = bout.toByteArray();

    // Set the appropriate HTTP parameters.
    httpConn.setRequestProperty( "Content-Length",
                                 String.valueOf( b.length ) );
    httpConn.setRequestProperty("Content-Type","text/xml; charset=utf-8");
      httpConn.setRequestProperty("SOAPAction",SOAPAction);
    httpConn.setRequestMethod( "POST" );
    httpConn.setDoOutput(true);
    httpConn.setDoInput(true);

    // Everything's set up; send the XML that was read in to b.
    OutputStream out = httpConn.getOutputStream();
    out.write( b );    
    out.close();

    // Read the response and write it to standard out.

    InputStreamReader isr =
        new InputStreamReader(httpConn.getInputStream());
    BufferedReader in = new BufferedReader(isr);

    String inputLine;

    while ((inputLine = in.readLine()) != null)
        System.out.println(inputLine);

    in.close();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM