URL endpoint = new URL(null, apiURL, new URLStreamHandler() { @Override protected URLConnection openConnection(URL url) throws IOException { URL target = new URL(url.toString()); URLConnection connection = target.openConnection(); // Connection settings connection.setConnectTimeout(timeout); connection.setReadTimeout(timeout); return(connection); } }); SOAPMessage soapResponse = soapConnection.call(soapMessage, endpoint);
附上代码: com.sun.xml.internal.messaging.saaj.client.p2p.HttpSOAPConnection 可以看到,post方法会调用URL的createConnection方法来获取连接, 所以这段代码应该好使。
public SOAPMessage call(SOAPMessage message, Object endPoint) throws SOAPException { ...... if (endPoint instanceof URL) try { SOAPMessage response = post(message, (URL)endPoint); return response; } catch (Exception ex) { // TBD -- chaining? throw new SOAPExceptionImpl(ex); } else { log.severe("SAAJ0007.p2p.bad.endPoint.type"); throw new SOAPExceptionImpl("Bad endPoint type " + endPoint); } }
SOAPMessage post(SOAPMessage message, URL endPoint) throws SOAPException, IOException { boolean isFailure = false;
URL url = null; HttpURLConnection httpConnection = null;
int responseCode = 0; try { if (endPoint.getProtocol().equals("https")) //if(!setHttps) initHttps(); // Process the URL URI uri = new URI(endPoint.toString()); String userInfo = uri.getRawUserInfo();
url = endPoint;
if (dL > 0) d("uri: " + userInfo + " " + url + " " + uri);
// TBD // Will deal with https later. if (!url.getProtocol().equalsIgnoreCase("http") && !url.getProtocol().equalsIgnoreCase("https")) { log.severe("SAAJ0052.p2p.protocol.mustbe.http.or.https"); throw new IllegalArgumentException( "Protocol " + url.getProtocol() + " not supported in URL " + url); } httpConnection = (HttpURLConnection) createConnection(url);
httpConnection.setRequestMethod("POST");
httpConnection.setDoOutput(true); httpConnection.setDoInput(true); httpConnection.setUseCaches(false); httpConnection.setInstanceFollowRedirects(true);
if (message.saveRequired()) message.saveChanges();
MimeHeaders headers = message.getMimeHeaders();
Iterator it = headers.getAllHeaders(); boolean hasAuth = false; // true if we find explicit Auth header while (it.hasNext()) { MimeHeader header = (MimeHeader) it.next();
String[] values = headers.getHeader(header.getName()); if (values.length == 1) httpConnection.setRequestProperty( header.getName(), header.getValue()); else { StringBuffer concat = new StringBuffer(); int i = 0; while (i < values.length) { if (i != 0) concat.append(','); concat.append(values[i]); i++; }
httpConnection.setRequestProperty( header.getName(), concat.toString()); }
if ("Authorization".equals(header.getName())) { hasAuth = true; if (log.isLoggable(Level.FINE)) log.fine("SAAJ0091.p2p.https.auth.in.POST.true"); } }
if (!hasAuth && userInfo != null) { initAuthUserInfo(httpConnection, userInfo); }
OutputStream out = httpConnection.getOutputStream(); try { message.writeTo(out); out.flush(); } finally { out.close(); }
httpConnection.connect();
try {
responseCode = httpConnection.getResponseCode();
// let HTTP_INTERNAL_ERROR (500) through because it is used for SOAP faults if (responseCode == HttpURLConnection.HTTP_INTERNAL_ERROR) { isFailure = true; } //else if (responseCode != HttpURLConnection.HTTP_OK) //else if (!(responseCode >= HttpURLConnection.HTTP_OK && responseCode < 207)) else if ((responseCode / 100) != 2) { log.log(Level.SEVERE, "SAAJ0008.p2p.bad.response", new String[] {httpConnection.getResponseMessage()}); throw new SOAPExceptionImpl( "Bad response: (" + responseCode + httpConnection.getResponseMessage());
} } catch (IOException e) { // on JDK1.3.1_01, we end up here, but then getResponseCode() succeeds! responseCode = httpConnection.getResponseCode(); if (responseCode == HttpURLConnection.HTTP_INTERNAL_ERROR) { isFailure = true; } else { throw e; }
}
} catch (SOAPException ex) { throw ex; } catch (Exception ex) { log.severe("SAAJ0009.p2p.msg.send.failed"); throw new SOAPExceptionImpl("Message send failed", ex); }
SOAPMessage response = null; InputStream httpIn = null; if (responseCode == HttpURLConnection.HTTP_OK || isFailure) { try { MimeHeaders headers = new MimeHeaders();
String key, value;
// Header field 0 is the status line so we skip it.
int i = 1;
while (true) { key = httpConnection.getHeaderFieldKey(i); value = httpConnection.getHeaderField(i);
if (key == null && value == null) break;
if (key != null) { StringTokenizer values = new StringTokenizer(value, ","); while (values.hasMoreTokens()) headers.addHeader(key, values.nextToken().trim()); } i++; }
httpIn = (isFailure ? httpConnection.getErrorStream() : httpConnection.getInputStream());
byte[] bytes = readFully(httpIn);
int length = httpConnection.getContentLength() == -1 ? bytes.length : httpConnection.getContentLength();
// If no reply message is returned, // content-Length header field value is expected to be zero. if (length == 0) { response = null; log.warning("SAAJ0014.p2p.content.zero"); } else { ByteInputStream in = new ByteInputStream(bytes, length); response = messageFactory.createMessage(headers, in); }
} catch (SOAPException ex) { throw ex; } catch (Exception ex) { log.log(Level.SEVERE,"SAAJ0010.p2p.cannot.read.resp", ex); throw new SOAPExceptionImpl( "Unable to read response: " + ex.getMessage()); } finally { if (httpIn != null) httpIn.close(); httpConnection.disconnect(); } } return response; }
|