嗨,你好吗?我正在尝试转换 xml raw 消息来自 IBM 大型机,采用 IBM-37 图表集编码格式为 UTF-8,以便在 springboot 应用程序中理解。 知道怎么做吗?我正在使用 Feign 的 http 请求到 Apache 的 HttpClient 5。
public interface SoapClient {
@RequestLine("POST")
@Headers({"SOAPAction: operationSaveReq", "Content-Type: text/xml;charset=UTF-8",
"Accept: text/xml"})
String operationSaveReq(String soapBody);
}
RESoapClient soapClient = Feign.builder()
.client(new ApacheHttp5Client())
.target(SoapClient.class, "http://10.10.10.10:8000/B2B/Broker/api/v1");
String soapResponse = soapClient.operationSaveReq("xml string");
字符串对象soapResponse返回原始消息,例如:
这引起了我的兴趣,所以我研究了一下 Feign。事实证明,OkHttp 客户端检测到字符集参数并正确解码有效负载。此处的示例使用 JDK 内置 HTTP 服务器,提供 ibm-37 编码的 XML:
import java.net.InetSocketAddress;
import java.nio.charset.Charset;
import com.sun.net.httpserver.HttpServer;
import feign.Feign;
import feign.okhttp.OkHttpClient;
public class Main {
public static void main(String[] args) throws Exception {
var server = HttpServer.create(new InetSocketAddress("localhost", 0), 0);
server.createContext("/", x -> {
x.getResponseHeaders().add("Content-Type", "text/xml;charset=ibm-37");
x.sendResponseHeaders(201, 0);
x.getResponseBody().write("<root version='4711'><sub>data</sub></root>".getBytes(Charset.forName("ibm-37")));
x.getResponseBody().close();
});
server.start();
try {
var url = String.format("http://localhost:%d/", server.getAddress().getPort());
var soapClient = Feign.builder()
.client(new OkHttpClient())
.target(SoapClient.class, url);
var soapResponse = soapClient.operationSaveReq("xml string");
System.out.println(soapResponse);
} finally {
server.stop(0);
}
}
}
如果您需要使用 Apache 客户端,您可能必须创建自定义解码器,或者配置 Apache 客户端以支持完整的内容类型信息。