我已经通过Java套接字手动开发了一个soap连接(这是一个非常简单的soap请求,Axis给出了很多构建问题)。
为了实现这一点,我基本上复制了我从 Soap UI 中获取的 HTTP 标头,并编写了以下代码:
String hostname = "aaaaa";
int port = 11111;
InetAddress addr = InetAddress.getByName(hostname);
Socket sock = new Socket(addr, port);
sock.setSoTimeout(100000);
BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream(),"UTF-8"));
wr.write("POST " + "http://aaaa:11111/servicePath" + " HTTP/1.1\r\n");
wr.write("Host: aaaaa:11111\r\n");
wr.write("Accept-Encoding: gzip,deflate\r\n");
wr.write("Content-Length: " + soapXml.length() + "\r\n");
wr.write("Content-Type: text/xml; charset=\"UTF-8\"\r\n");
//wr.write("Connection: Keep-Alive\r\n");
wr.write("SOAPAction: \"/someSoapAction\"\r\n");
wr.write("User-Agent: Apache-HttpClient/4.1.1 (java 1.5)\r\n");
wr.write("\r\n");
wr.write(soapXml);
wr.flush();
请求成功,这意味着我从服务中得到了我期望的响应。例如,当我手写“soapXml”一些无效参数时,我得到一个 500 错误返回 XML 解释问题,如果我正确设置所有内容,我得到一个 200 OK,标题后面有一个 xml 正文。
问题是套接字在 200OK 的情况下在读取 HTTP 正文之前挂起 60 秒。
它基本上读取完整的标头,然后等待 60 秒,然后(我认为某些协议超时并且)最后读取 xml 正文。
这是我阅读响应的代码:
String line;
BufferedReader rd = new BufferedReader(new java.io.InputStreamReader(sock.getInputStream(),"UTF-8"));
while ((line = rd.readLine()) != null) {
i++;
LOG.debug("cycle: "+i+" -------- "+line);
//after printing the header, it hangs 60 seconds before printing the follwing XML
if ((line.length() >0) && (line.charAt(0) == '<'))
{
responseXML = line;
}
}
这是一个示例 200 OK 标头:
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: text/xml;charset=utf-8
Content-Length: 1052
Date: Sun, 13 Jan 2013 08:33:45 GMT -- hanging 60 seconds here
-- blank line
<?xml version="1.0" encoding="UTF-8"?>................</SOAP-ENV:Envelope>
有没有人遇到过这种情况?请注意,这显然不是服务器问题,因为使用肥皂 UI 会立即提供答案。
谢谢