繁体   English   中英

将 XML 转换为 JSON,反之亦然,以及如何在发出 XML 请求时识别 REST 端点?

[英]Convert XML to JSON and Vice Versa and also how to identify REST endpoint while making XML Request?

在发布这个问题之前,我做了很多研究,但是我没有得到适当的指导。 我的公司已通过Proxy/Gateway将 REST 端点暴露给外部世界。 大约有 1000 名客户加入了代理/网关,并向基于 SOAP 的系统(部署在WebSphere App Server (WAS) V7.5 上)发出 XML 请求。 现在,我们开发了仅支持 JSON 的新系统,并希望指向部署在 PCF(Pivotal Cloud Foundry)上的新开发系统。

在这里我们不想要求消费者做任何改变。

现在,我们正在尝试开发Adapter (Spring Boot Project) ,它将 XML 请求转换为 JSON 向新系统发出请求并以 JSON 获得响应,然后Adapter (Spring Boot Project)再次将 JSON 转换为 XML。 在这里,JSON 响应和 XML 响应有时可能不同。

现在,我真的无法决定调用哪个端点

String xml_data = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:urn=\"urn:ahc.com:dms:wsdls:organization\">\n" + 
        "   <soapenv:Header/>\n" + 
        "   <soapenv:Body>\n" + 
        "      <urn:getRoles>\n" + 
        "         <getRolesRequest>\n" + 
        "            <Type>ABC</Type>\n" + 
        "         </getRolesRequest>\n" + 
        "      </urn:getRoles>\n" + 
        "   </soapenv:Body>\n" + 
        "</soapenv:Envelope>";
JSONObject obj = XML.toJSONObject(xml_data);
System.out.println(obj);

它给了我以下回应。

{"soapenv:Envelope":{"soapenv:Body":{"urn:getRoles":{"getRolesRequest":{"Type":"AYU"}}},"xmlns:soapenv":"http://schemas.xmlsoap.org/soap/envelope/","xmlns:urn":"urn:ahc.com:dms:wsdls:organization","soapenv:Header":""}}

任何指导?

注意:我想从 JSON 对象中删除<soapenv:Envelope xmlns:soapenv=\\"http://schemas.xmlsoap.org/soap/envelope/\\ 。另外,在将 JSON 转换为 XML 时,我想添加<soapenv:Envelope xmlns:soapenv=\\"http://schemas.xmlsoap.org/soap/envelope/\\

您可以使用underscore-java库。 它具有读取 xml 和生成 json 的静态方法。

    String xmlData = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\""
    + " xmlns:urn=\"urn:ahc.com:dms:wsdls:organization\">\n"
    + "   <soapenv:Header/>\n"
    + "   <soapenv:Body>\n"
    + "      <urn:getRoles>\n"
    + "         <getRolesRequest>\n"
    + "            <Type>ABC</Type>\n"
    + "         </getRolesRequest>\n"
    + "      </urn:getRoles>\n"
    + "   </soapenv:Body>\n"
    + "</soapenv:Envelope>";
    Map<String, Object> jsonData = U.<Map<String, Object>>get(
        U.<Map<String, Object>>fromXmlWithoutNamespaces(xmlData), "Envelope.Body.getRoles");
    System.out.println(U.toJson(jsonData));

输出:

{
  "getRolesRequest": {
    "Type": "ABC"
  }
}

如果您的网关支持为每个端点传递自定义标头,那将是执行此操作的理想方式。 在这种情况下,它将在请求标头中发送 REST 端点,您可以使用它来转发调用。

如果网关不支持此类功能,您可以尝试修改您的Adapter代码。

如果要配置适配器以保存端点映射,可以使用@ConfigurationProperties进行配置

EndpointRegistry

import java.util.Map;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.stereotype.Component;

@EnableConfigurationProperties
@ConfigurationProperties(prefix = "endpoint")
@Component
public class EndpointRegistry {

    // top key - endpoint
    // one key - soapUrl
    // another key - restUrl
    private Map<String, Map<String, String>> api;

    public Map<String, Map<String, String>> getApi() {
        return api;
    }

    public void setApi(Map<String, Map<String, String>> api) {
        this.api = api;
    }
}

这将匹配您的application.properties文件中提到的密钥模式,如下所示

endpoint.api.endpoint1.soapUrl=<soap-url>
endpoint.api.endpoint1.restUrl=<rest-url>

endpoint.api.endpoint2.soapUrl=<soap-url>
endpoint.api.endpoint2.restUrl=<rest-url>

现在, endpoint name应该是唯一的。 您可以决定密钥结构。 这只是一个例子。

这是一个用于验证值的测试控制器:

import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/endpoints")
public class EndpointController {

    @Autowired
    EndpointRegistry registry;

    @GetMapping
    public Map<String, String> getRestUrl(String endpoint) {
        return registry.getApi().get(endpoint);
    }
}

http://localhost:8080/endpoints?endpoint=endpoint1进行GET调用

你应该得到

{
   "soapUrl":"<soap-url>",
   "restUrl":"<rest-url>"
}

这样,您可以使用EndpointRegistry获取所需的 URL 并进行调用。

您可以使用 Spring 配置服务器为每个环境更新您的 application.properties。 在这里检查: https : //cloud.spring.io/spring-cloud-config/multi/multi__spring_cloud_config_server.html

同时,您可以配置 CI 管道以预先为每个环境添加这些属性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM