6

我正在创建一个 SOAP 消息,然后尝试使用以下代码发送它。

try {
  System.setProperty("http.proxyHost", "proxy.myproxy.com");
  System.setProperty("http.proxyPort", "80");
  connection = SOAPConnectionFactory.newInstance().createConnection();
  response = connection.call(message, "https://www.service.com/call");  
  connection.close();
} catch (SOAPException e) {
  e.printStackTrace();
} catch (UnsupportedOperationException e) {
  e.printStackTrace();
} 
finally{
  System.setProperty("http.proxyHost", "");
  System.setProperty("http.proxyPort", "");
}

最后是因为我在访问本地域上的 url 时需要绕过代理。我知道这是一种黑客行为,并且会对其他解决方案感兴趣。然而,真正的问题与超时有关。但是,每次都会超时,如果我获取 SOAP 消息并使用 SOAPUI(相同的代理设置)发送它,我会得到成功的响应。

Java 代码的响应...

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"><soapenv:Body><soapenv:Fault><faultcode>soapenv:Server</faultcode><faultstring>java.net.ConnectException: Connection timed out: no further information</faultstring></soapenv:Fault></soapenv:Body></soapenv:Envelope>
4

1 回答 1

2

我最终使用了这个...

public static String soapHttpRequest(RequestInfo re) {
    HttpURLConnection connection = null;
    OutputStreamWriter wr = null;
    BufferedReader rd = null;
    StringBuilder sb = null;
    String line = null;

    URL serverAddress = null;

    System.setProperty("http.proxyHost", "proxy.my.com");
    System.setProperty("http.proxyPort", "80");
    System.setProperty("https.proxyHost", "proxy.my.com");
    System.setProperty("https.proxyPort", "80");

    try {
                    serverAddress = new URL("https://site.com/service/default.asp");
        // set up out communications stuff
        connection = null;

        // Set up the initial connection
        connection = (HttpURLConnection) serverAddress.openConnection();
        connection.setDoOutput(true);
        connection.setRequestMethod("POST");
        connection.setRequestProperty("Content-type", "text/xml; charset=utf-8");
        connection.setRequestProperty("SOAPAction", 
              "https://site.com/service/default.asp#Method");
        OutputStream reqStream = connection.getOutputStream();
        reqStream.write(getSoapMessageString(re).getBytes());
        connection.connect();


        // read the result from the server
        rd = new BufferedReader(new InputStreamReader(
                connection.getInputStream()));
        sb = new StringBuilder();

        while ((line = rd.readLine()) != null) {
            sb.append(line + '\n');
        }
        String val = sb.toString();
        System.out.println(val);
        return val;

    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (ProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        // close the connection, set all objects to null
        connection.disconnect();
        rd = null;
        sb = null;
        wr = null;
        connection = null;
              // Closing to prevent issues with local calls
        System.setProperty("http.proxyHost", "");
        System.setProperty("http.proxyPort", "");
        System.setProperty("https.proxyHost", "");
        System.setProperty("https.proxyPort", "");
    }
    return null;
}
于 2013-05-01T03:03:39.547 回答