【问题标题】:How to send raw SOAP request in Java?如何在 Java 中发送原始 SOAP 请求?
【发布时间】:2021-02-19 23:11:38
【问题描述】:

我需要向服务器发送原始 SOAP 请求。 我的请求看起来像

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>

这是由 SOAP UI 生成的标准原始请求(使用 Web 服务的 wsdl),所以如果我将它发送到那里,我会得到 HTTP 代码 200 和一些正常响应。 我想使用 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();

我收到 HTTP 状态 500 和处理时发生错误的 SOAP 消息。 谢谢。

【问题讨论】:

    标签: java sockets soap


    【解决方案1】:

    你可以这样尝试吗:你需要用你的替换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();
    }
    

    【讨论】:

    • 非常有帮助,谢谢!如果您在使用 InvalidSecurity 时遇到问题,请添加 wr.write("SOAPAction: \r\n");
    【解决方案2】:

    我找到了答案。这段代码对我有用

        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;
    

    【讨论】:

      【解决方案3】:

      我知道有点晚了,但 Unirest 救了我很多。

      你应该简单地尝试一下:

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

      【讨论】:

        【解决方案4】:

        您可以使用 java HttpURLConnection 代替 socket,在这里您必须正确设置 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();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-07-01
          • 1970-01-01
          • 1970-01-01
          • 2015-08-23
          • 1970-01-01
          相关资源
          最近更新 更多