gpt4 book ai didi

Java Web 服务请求-响应问题

转载 作者:行者123 更新时间:2023-12-01 15:20:30 25 4
gpt4 key购买 nike

我正在实现基于 WS 的代理,它将管理来自 PCRF 的 SOAP 请求/响应。连接是通过 https 端口进行的,并且使用 Java Key Store( key 存储工具)生成 a key-store file from a trusted certificate 。连接似乎没问题(我不确定身份验证是否成功),但返回的信息(响应)是一个短的不可读的字符串。

同样的程序通过 SoapUI应用程序工作正常。

两个过程之间的唯一区别是,第一个过程我使用 key 存储,第二个过程我使用受信任的证书。

我怎样才能解决这个问题?我不明白哪里出了问题。

如果有帮助,我可以将用于 SOAP 消息发送者的 Java 源代码以及从 PSRF 收到的响应共享到 SoapUI 和实现的 WS 中。

package SOAPSender;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;

public class DebugMain {

public static void main(String[] args) {
//PCRFProvisioningAgent temp = new PCRFProvisioningAgent();

loadKeyAndTrustStore();

StringBuffer outputStream = new StringBuffer();
BufferedWriter wr = null;
BufferedReader rd = null;
Socket sock = null;
String outputBuffer = null;

try {

// Create socket
sock = new Socket("10.96.227.219", 8080);

// Create header
wr = new BufferedWriter(new OutputStreamWriter(
sock.getOutputStream(), "UTF-8"));

String xmlData = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:rm=\"rm:soap\">"+
"<soapenv:Header/>"+
"<soapenv:Body>"+
"<rm:getSubscriber>"+
"<inPara>"+
"<subscriber>"+
"<attribute>"+
"<key>USRIDENTIFIER</key>"+
"<value>284090000000004</value>"+
"</attribute>"+
"</subscriber>"+
"</inPara>"+
"</rm:getSubscriber>"+
"</soapenv:Body>"+
"</soapenv:Envelope>";

wr.write("POST https://10.96.227.219:8080/axis/services/ScfPccSoapServiceEndpointPort HTTP/1.1\r\n");
wr.write("User-Agent: https://10.96.227.219:8080/axis/services/ScfPccSoapServiceEndpointPort\r\n");
wr.write("Content-Length: " + xmlData.length() + "\r\n");
wr.write("Content-Type: text/xml;charset=UTF-8\r\n");
// wr.write("SOAPAction: \"rm:soap/ScfPccSoapServiceEndpoint/getSubscriberRequest\"\r\n");
wr.write("SOAPAction: \"\"\r\n");
wr.write("\r\n");

// Send data
wr.write(xmlData);
wr.flush();

// Read response
// exception handler - when connection is reset instead of close
// after sending a packet from source
char cbuf[] = new char[4096];
int i = 0;
// buffer is sized to max 4096 packet size

try {
rd = new BufferedReader(new InputStreamReader(
sock.getInputStream(), "UTF-8"));
while ((i = rd.read(cbuf)) != -1) {
outputStream.append(cbuf, 0, i);
int contStartIndex = outputStream.toString().indexOf(
"Content-Length: ")
+ "Content-Length: ".length();
int contEndIndex = outputStream.toString().indexOf("\n",
contStartIndex) - 1;
if (outputStream.toString().indexOf("Content-Length: ") != -1) {
int contLength = Integer.valueOf(
outputStream.toString().substring(
contStartIndex, contEndIndex))
.intValue();
int headerLength = outputStream
.toString()
.substring(
0,
outputStream.toString().indexOf(
"\n\r\n")).length() + 3;
// if the message body is complete but there is not an
// ending character
// while will break
// warning - with national characters! content length is
// count of bytes not chars
if (i - headerLength >= contLength)
break;
}
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("--------\n" + String.valueOf(cbuf)
+ "\n--------------");
outputBuffer = outputStream.toString();

} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (wr != null)
wr.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
if (rd != null)
rd.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
if (sock != null)
sock.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

private static void loadKeyAndTrustStore() {
try {
// System.out.println(Constants.ROOT_PATH + Constants.STORE_FILE);
// AdminLogger.error("Certificate file: " + Constants.ROOT_PATH
// + Constants.STORE_FILE);

// System load ssl the file of certificate
// Load Key store

System.out.println(System.getProperty("javax.net.ssl.keyStoreType"));
System.setProperty("javax.net.ssl.keyStoreType", "****");
System.out.println(System.getProperty("javax.net.ssl.keyStoreType"));

System.out.println(System.getProperty("javax.net.ssl.keyStore"));
System.setProperty("javax.net.ssl.keyStore",
"****");
System.out.println(System.getProperty("javax.net.ssl.keyStore"));

System.out.println(System.getProperty("javax.net.ssl.keyStorePassword"));
System.setProperty("javax.net.ssl.keyStorePassword", "****");
System.out.println(System.getProperty("javax.net.ssl.keyStorePassword"));


// TrustStore

System.out.println(System.getProperty("javax.net.ssl.trustStore"));
System.setProperty("javax.net.ssl.trustStore",
"****");
System.out.println(System.getProperty("javax.net.ssl.trustStore"));

System.out.println(System.getProperty("javax.net.ssl.trustStorePassword"));
System.setProperty("javax.net.ssl.trustStorePassword", "****");
System.out.println(System.getProperty("javax.net.ssl.trustStorePassword"));

} catch (Exception ex) {
// AdminLogger.error(ex, "StartupServlet.loadKeyAndTrustStore");
}
}

}

这是回复:

...这是来自 SoapUI 应用程序的响应:

<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">
<soapenv:Body>
<getSubscriberResponse xmlns="rm:soap">
<result xmlns="">
<resultCode>12302</resultCode>
<paras>
<key>errorDescription</key>
<value>The subscriber does not exist.</value>
</paras>
</result>
</getSubscriberResponse>
</soapenv:Body>
</soapenv:Envelope>

最佳答案

套接字并不是从 Java 调用 Web 服务的理想方式。请使用 JAX-WS 等 Java API。从 PSRF Web 服务获取 WSDL 并使用 ws-import 命令生成客户端 stub 。

在安全性方面,您需要使用 JAX-WS 安全 API 来调用受 WS-Security 保护的 Web 服务。

查看此帖子 - jax-ws-consuming-web-service-with-ws-security-and-ws-addressing

谢谢,斯里哈里。

关于Java Web 服务请求-响应问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10993915/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com