简体   繁体   English

如何使用 SAP Cloud SDK 3.2.0 在 Java 中检索目标?

[英]How to retrieve a destination in Java with SAP Cloud SDK 3.2.0?

I'm developing a Java application that uses SAP Cloud SDK version 3.2.0.我正在开发一个使用 SAP Cloud SDK 3.2.0 版的 Java 应用程序。 I've doubts about how destinations are retrieved.我怀疑如何检索目的地。 When I test the application by running it on my local machine, I can send a POST request to an exposed OData service without problems, the problem is when I deploy the application in an SAP Cloud Platform development account for the Neo environment, where I've created a destination called ErpQueryEndpoint and I use SAP Cloud Connector to establish the connection as shown here:当我通过在我的本地机器上运行它来测试应用程序时,我可以毫无问题地将 POST 请求发送到公开的 OData 服务,问题是当我在 Neo 环境的 SAP Cloud Platform 开发帐户中部署应用程序时,我在那里我已经创建了一个名为 ErpQueryEndpoint 的目的地,我使用 SAP Cloud Connector 建立连接,如下所示:

This is the application code, first a call is made to the bpCreateExtended method and this in turn calls the executeAsyncCall method, this will be executed asynchronously:这是应用程序代码,首先调用 bpCreateExtended 方法,然后调用 executeAsyncCall 方法,这将异步执行:

        public Object executeAsyncCall(BpCreateBasicRequest bpCreateRequest) {
        ...
    
    try {

        ODataCreateRequestImpl createRequest = new ODataCreateRequestImpl("/sap/opu/odata/sap/ZAS_BP_CREATION_SRV",
                           "BP_DATASet", bodyAsMap, null, null, null, headersAsMap, null, false, null, null, false);
        
        //Creating destination at runtime
        DefaultDestination dest = DefaultDestination.builder()
            .property("Name", "ErpQueryEndpoint")
            .property("URL", "http://crmdev:4431")
            .property("Type", "HTTP")
            .property("Authentication", "BasicAuthentication")
            .property("User", abapUser)
            .property("Password", abapPass)
            .build();
            
        HttpDestination destination = dest.asHttp();
        HttpClient httpClient = HttpClientAccessor.getHttpClient(destination);      
        Map<String, Object> resp = createRequest.execute(httpClient).asMap();
        jsonResponse = new JSONObject(resp);

    } catch (HttpServerErrorException e) {
        logger.info("504 Gateway Timeout first steep. SCP Timeout " + e.getMessage());
    } catch (Exception e) {
        e.printStackTrace();
    }
    
    ...
    
    return jsonResponse;
}


public Object bpCreateExtended(BpCreateBasicRequest bpCreateRequest) throws IOException {

    this.conf = ResilienceConfiguration.of(AccountBFimpl.class);
    Object response = null;


    CompletableFuture<Object> futureFirstSteep = ResilienceDecorator.queueCallable(() ->
            executeAsyncCall(bpCreateRequest), conf);

    return (JSONObject) response;
}

This is the error obtained when sending a POST request if the application has been deployed in the SAP Cloud Platform Neo development account:如果应用程序已部署在 SAP Cloud Platform Neo 开发帐户中,则发送 POST 请求时会出现以下错误:

ERROR#com.sap.cloud.sdk.odatav2.connectivity.cache.metadata.GuavaMetadataCache##S0020495660#ForkJoinPool.commonPool-worker-2#na#gfna57xvah#atlantidaapi#web##na#na#na#na#Error occurred while populating metadata: java.net.UnknownHostException: crmdev: Name or service not known错误#com.sap.cloud.sdk.odatav2.connectivity.cache.metadata.GuavaMetadataCache##S0020495660#ForkJoinPool.commonPool-worker-2#na#gfna57xvah#atlantidaapi#web##na#na#na#na#发生错误填充元数据时:java.net.UnknownHostException: crmdev: 名称或服务未知

In the executeAsyncCall method, I'm creating the destination at runtime, but I don't know if the implementation is correct or if I can do something different to get the destination of the development account in SAP Cloud Platform Cockpit Neo.在 executeAsyncCall 方法中,我在运行时创建目标,但我不知道实现是否正确,或者我是否可以做一些不同的事情来获取 SAP Cloud Platform Cockpit Neo 中开发帐户的目标。 Can someone help me find a solution?有人可以帮我找到解决方案吗?

This is the content of my pom.xml:这是我的 pom.xml 的内容:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.atlantida.services</groupId>
    <artifactId>account</artifactId>
    <packaging>war</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>atlantida</name>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.sap.cloud.sdk</groupId>
                <artifactId>sdk-bom</artifactId>
                <version>3.2.0</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <properties>
        <java-version>1.8</java-version>
        <springframework.version>5.1.8.RELEASE</springframework.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <junit.version>4.11</junit.version>
        <jackson-version>2.9.2</jackson-version>
        <lombok.version>1.18.8</lombok.version>

        <jcl.slf4j.version>1.7.12</jcl.slf4j.version>
        <logback.version>1.1.3</logback.version>

        <!-- if you are behind a proxy use the following two properties to configure your proxy. Default: None -->
        <proxy.host />
        <proxy.port />
        <non.proxy.hosts />

        <!-- Properties that are related to the SAP Cloud Platform. -->
        <scp.sdkVersion>1.44.12</scp.sdkVersion>

        <!-- this is the location of your local SAP CP Neo runtime -->
        <scp.sdkInstallPath>${project.basedir}/scp/sdk-${scp.sdkVersion}</scp.sdkInstallPath>
        <scp.sdkLocalServerContentPath>${project.basedir}/localServerContent</scp.sdkLocalServerContentPath>
        <scp.sdkErpEndpoint>${scp.sdkInstallPath}/server/config_master/service.destinations/destinations/ErpQueryEndpoint</scp.sdkErpEndpoint>

        <scp.sdkSymbolicLink>${project.basedir}/scp/sdk</scp.sdkSymbolicLink>
        <scp.sdkNeoCmdExtension>.sh</scp.sdkNeoCmdExtension>
        <scp.sdkNeoCmd>${scp.sdkInstallPath}/tools/neo${scp.sdkNeoCmdExtension}</scp.sdkNeoCmd>
        <scp.sdkLocalServer>${scp.sdkInstallPath}/server</scp.sdkLocalServer>

        <scp.skipInstallSdk>false</scp.skipInstallSdk>
        <scp.skipDeploy>false</scp.skipDeploy>
        <scp.skipPutDestination>false</scp.skipPutDestination>
        <scp.skipRestart>false</scp.skipRestart>
        <scp.skipRollingUpdate>true</scp.skipRollingUpdate>

        <scp.vmArguments />
        <scp.vmSize>lite</scp.vmSize>
        <scp.vmMinProcesses>1</scp.vmMinProcesses>
        <scp.vmMaxProcesses>1</scp.vmMaxProcesses>

        <scp.app />
        <scp.host />
        <scp.account />
        <scp.username />
        <scp.password />

        <!-- Required for SAP CP user session management and audit logging. -->
        <scp.warImportPackage>com.sap.security.auth.service,com.sap.security.um.service.api,com.sap.core.service.auditlog.impl,com.sap.cloud.auditlog,com.sap.cloud.auditlog.exception,com.sap.cloud.auditlog.extension</scp.warImportPackage>

        <!-- Defines whether the deployment is productive or not. -->
        <productive />
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${springframework.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${springframework.version}</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.0</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>${jackson-version}</version>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>${jackson-version}</version>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.datatype</groupId>
            <artifactId>jackson-datatype-jsr310</artifactId>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>com.googlecode.json-simple</groupId>
            <artifactId>json-simple</artifactId>
            <version>1.1.1</version>
        </dependency>

        <!-- Bridge logging from JCL to SLF4j -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>jcl-over-slf4j</artifactId>
            <version>${jcl.slf4j.version}</version>
        </dependency>

        <!-- logback -->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>${logback.version}</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.json/json -->
        <dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>20190722</version>
        </dependency>

        <dependency>
            <groupId>com.sap.cloud.sdk.cloudplatform</groupId>
            <artifactId>scp-neo</artifactId>
        </dependency>

        <dependency>
            <groupId>com.sap.cloud.servicesdk</groupId>
            <artifactId>odatav2-connectivity</artifactId>
            <version>1.32.5</version>
        </dependency>

        <dependency>
            <groupId>com.sap.cloud.sdk.cloudplatform</groupId>
            <artifactId>security-servlet</artifactId>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>javax.inject</groupId>
            <artifactId>javax.inject</artifactId>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>com.sap.cloud</groupId>
            <artifactId>neo-javaee7-wp-api</artifactId>
            <scope>provided</scope>
        </dependency>
    </dependencies>

    <build>
        <finalName>atlantida</finalName>

        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-enforcer-plugin</artifactId>
                    <version>3.0.0-M2</version>
                    <executions>
                        <execution>
                            <id>SAP Cloud SDK Project Structure Checks</id>
                            <goals>
                                <goal>enforce</goal>
                            </goals>
                            <configuration>
                                <rules>
                                    <requireMavenVersion>
                                        <version>3.5</version>
                                    </requireMavenVersion>
                                    <requireJavaVersion>
                                        <version>${java.version}</version>
                                    </requireJavaVersion>
                                    <reactorModuleConvergence />
                                </rules>
                                <fail>true</fail>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-war-plugin</artifactId>
                    <version>3.2.2</version>
                    <configuration>
                        <attachClasses>true</attachClasses>
                        <archive>
                            <manifestEntries>
                                <Version>${project.version}</Version>
                                <Import-Package>${scp.warImportPackage}</Import-Package>
                            </manifestEntries>
                        </archive>
                        <webResources>
                            <resources>
                                <filtering>true</filtering>
                                <directory>src/main/webapp</directory>
                                <includes>
                                    <include>**/web.xml</include>
                                </includes>
                            </resources>
                        </webResources>
                    </configuration>
                </plugin>

                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-dependency-plugin</artifactId>
                    <version>3.1.1</version>
                    <configuration>
                        <artifactItems>
                            <artifactItem>
                                <groupId>com.sap.cloud</groupId>
                                <artifactId>neo-javaee7-wp-sdk</artifactId>
                                <version>${scp.sdkVersion}</version>
                                <type>zip</type>
                                <overWrite>false</overWrite>
                                <outputDirectory>${scp.sdkInstallPath}</outputDirectory>
                            </artifactItem>
                        </artifactItems>
                    </configuration>
                </plugin>

                <!-- Plugin for deployment to SAP Cloud Platform Neo. -->
                <plugin>
                    <groupId>com.sap.cloud</groupId>
                    <artifactId>neo-javaee7-wp-maven-plugin</artifactId>
                    <version>${scp.sdkVersion}</version>
                    <executions>
                        <execution>
                            <id>stop</id>
                            <phase>install</phase>
                            <goals>
                                <goal>stop</goal>
                            </goals>
                            <configuration>
                                <skip>${scp.skipRestart}</skip>
                            </configuration>
                        </execution>
                        <execution>
                            <id>deploy</id>
                            <phase>install</phase>
                            <goals>
                                <goal>deploy</goal>
                            </goals>
                            <configuration>
                                <skip>${scp.skipDeploy}</skip>
                                <vmArguments>${scp.vmArguments}</vmArguments>
                            </configuration>
                        </execution>
                        <execution>
                            <id>start</id>
                            <phase>install</phase>
                            <goals>
                                <goal>start</goal>
                            </goals>
                            <configuration>
                                <skip>${scp.skipRestart}</skip>
                            </configuration>
                        </execution>
                        <execution>
                            <id>rolling-update</id>
                            <phase>install</phase>
                            <goals>
                                <goal>rolling-update</goal>
                            </goals>
                            <configuration>
                                <skip>${scp.skipRollingUpdate}</skip>
                            </configuration>
                        </execution>
                    </executions>
                    <configuration>
                        <sdkInstallPath>${scp.sdkInstallPath}</sdkInstallPath>
                        <skip>${scp.skipInstallSdk}</skip>

                        <application>${scp.app}</application>
                        <source>${project.build.directory}/${project.build.finalName}.war</source>

                        <vmArguments>${scp.vmArguments}</vmArguments>
                        <size>${scp.vmSize}</size>
                        <minimumProcesses>${scp.vmMinProcesses}</minimumProcesses>
                        <maximumProcesses>${scp.vmMaxProcesses}</maximumProcesses>

                        <host>${scp.host}</host>
                        <account>${scp.account}</account>
                        <user>${scp.username}</user>
                        <password>${scp.password}</password>
                        <synchronous>true</synchronous>

                        <httpProxyHost>${proxy.host}</httpProxyHost>
                        <httpProxyPort>${proxy.port}</httpProxyPort>
                        <httpsProxyHost>${proxy.host}</httpsProxyHost>
                        <httpsProxyPort>${proxy.port}</httpsProxyPort>

                        <consoleCommand />
                        <consoleHttpProxyHost>${proxy.host}</consoleHttpProxyHost>
                        <consoleHttpProxyPort>${proxy.port}</consoleHttpProxyPort>
                        <consoleHttpsProxyHost>${proxy.host}</consoleHttpsProxyHost>
                        <consoleHttpsProxyPort>${proxy.port}</consoleHttpsProxyPort>

                        <dbsystem />
                        <dbSize />
                        <dbUser />
                    </configuration>
                </plugin>

                <!-- Plugin for deployment to local runtime of SAP Cloud Platform Neo. -->
                <plugin>
                    <groupId>com.sap.cloud.sdk.plugins</groupId>
                    <artifactId>scp-neo-maven-plugin</artifactId>
                    <version>3.2.0</version>
                    <configuration>
                        <sdkPlugin>neo-javaee7-wp-maven-plugin</sdkPlugin>
                        <sdkPluginVersion>${scp.sdkVersion}</sdkPluginVersion>
                        <sdkInstallPath>${scp.sdkInstallPath}</sdkInstallPath>
                        <sdkSymbolicLink>${scp.sdkSymbolicLink}</sdkSymbolicLink>
                        <sdkServerContentPath>${scp.sdkLocalServerContentPath}</sdkServerContentPath>
                        <source>${project.build.directory}/${project.build.finalName}.war</source>
                        <proxyHost>${proxy.host}</proxyHost>
                        <proxyPort>${proxy.port}</proxyPort>
                        <httpNonProxyHosts>${non.proxy.hosts}</httpNonProxyHosts>
                        <destinations>
                            <destination>
                                <path>${scp.sdkErpEndpoint}</path>
                                <username>achacon</username>
                                <password>****</password>
                                <url>http://crmdev:4431</url>
                            </destination>
                        </destinations>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>

        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>com.sap.cloud.sdk.plugins</groupId>
                <artifactId>usage-analytics-maven-plugin</artifactId>
                <version>3.2.0</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>usage-analytics</goal>
                        </goals>
                        <configuration>
                            <skipUsageAnalytics>false</skipUsageAnalytics>
                            <generateSalt>true</generateSalt>
                                <!--
                                Note: A random salt is auto-generated once the project is built for the first time.
                                Please keep the generated salt in the POM file, for example, when pushing to git.

                                To learn more, visit: https://blogs.sap.com/2018/10/23/usage-analytics-s4sdk/
                                -->
                            <salt>5d5e4e1e8a5f05d547fe8880f65173bda150a670f91f3657b970eaa9e7a4d392</salt>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

    <profiles>
        <!--
        Profiles that are used to set the Neo SDK "neo" command extension ("neo.sh" or "neo.cmd")
        -->
        <profile>
            <id>windows</id>
            <activation>
                <os>
                    <family>windows</family>
                </os>
            </activation>
            <properties>
                <scp.sdkNeoCmdExtension>.bat</scp.sdkNeoCmdExtension>
            </properties>
        </profile>
        <profile>
            <id>unix</id>
            <activation>
                <os>
                    <family>unix</family>
                </os>
            </activation>
            <properties>
                <scp.sdkNeoCmdExtension>.sh</scp.sdkNeoCmdExtension>
            </properties>
        </profile>

        <!-- Profile setting properties for deploying to the local SAP CP runtime. -->
        <profile>
            <id>local-deploy</id>
            <activation>
                <property>
                    <name>!scp.app</name>
                </property>
            </activation>
            <properties>
                <scp.skipInstallSdk>true</scp.skipInstallSdk>
                <scp.skipDeploy>true</scp.skipDeploy>
                <scp.skipPutDestination>true</scp.skipPutDestination>
                <scp.skipRestart>true</scp.skipRestart>
                <scp.skipRollingUpdate>true</scp.skipRollingUpdate>
            </properties>
        </profile>

        <!-- Profile setting properties for deploying a productive version to SAP CP. -->
        <profile>
            <id>scp-deploy</id>
            <activation>
                <property>
                    <name>productive</name>
                </property>
            </activation>
            <properties>
                <scp.skipInstallSdk>false</scp.skipInstallSdk>
                <scp.skipDeploy>true</scp.skipDeploy>
                <scp.skipPutDestination>false</scp.skipPutDestination>
                <scp.skipRestart>true</scp.skipRestart>
                <scp.skipRollingUpdate>false</scp.skipRollingUpdate>
            </properties>
        </profile>
    </profiles>
</project>

This is my ErpQueryEndpoint file: https://i.imgur.com/jIWsa4o.jpg这是我的 ErpQueryEndpoint 文件: https ://i.imgur.com/jIWsa4o.jpg

Instead of代替

Map<String, Object> resp = createRequest.execute(httpClient).asMap();

Please use请用

Map<String, Object> resp = createRequest.execute("ErpQueryEndpoint").asMap();

You don't have to create the Destination manually.您不必手动创建目标。

Alternatively you can also use:或者你也可以使用:

Destination dest = DestinationAccessor.getDestination("ErpQueryEndpoint");

Reason: By default the destination uses proxy type "Internet" ( No proxy ), but you want "OnPremise" to establish connectivity with the Cloud Connector.原因:默认情况下,目标使用代理类型“Internet”(无代理),但您希望“OnPremise”与 Cloud Connector 建立连接。


Update: When using SAP Cloud SDK 3 please use the fitting dependency of Service SDK as well.更新:使用SAP Cloud SDK 3时请同时使用Service SDK的适配依赖。 That means, instead of...这意味着,而不是...

        <dependency>
            <groupId>com.sap.cloud.servicesdk</groupId>
            <artifactId>odatav2-connectivity</artifactId>
            <version>1.32.5</version>
        </dependency>

use:采用:

        <dependency>
            <groupId>com.sap.cloud.servicesdk</groupId>
            <artifactId>odatav2-connectivity-sdk3</artifactId>
            <version>1.36.2</version>
        </dependency>

I managed to solve my problem following Alex's recommendations and adding the following lines of code below the CompletableFuture:我设法按照 Alex 的建议解决了我的问题,并在 CompletableFuture 下方添加了以下代码行:

try {
         response = futureFirstSteep.get(5000, TimeUnit.MILLISECONDS);
        } catch (TimeoutException e) {
        logger.info("TimeoutException: ", e.getMessage());
        } catch (InterruptedException e) {
        logger.info("InterruptedException: ", e.getMessage());
        } catch (ExecutionException e) {
        logger.info("ExecutionException: ", e.getMessage());
    }

In this case, the get(long, TimeUnit) method of the CompletableFuture class was the key to success, although I don't know why waiting for those 5 seconds to respond to the request is what prevents the error from being generated when I execute code asynchronously with the queueCallable method of ResilienceDecorator .在这种情况下, CompletableFuture类的get(long, TimeUnit)方法是成功的关键,虽然我不知道为什么等待那 5 秒响应请求是防止在我执行时生成错误的原因使用ResilienceDecoratorqueueCallable方法异步编码。 Thank you very much for the help, Alex and Emdee.非常感谢 Alex 和 Emdee 的帮助。

暂无
暂无

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

相关问题 使用 SAP Cloud SDK 3.2.0 版向 OData 服务发送 POST 请求时如何避免 DestinationAccessException - How to avoid a DestinationAccessException when sending a POST request to an OData service using SAP Cloud SDK version 3.2.0 使用 SAP Cloud SDK 版本 3.2.0 向 OData 服务发送 POST 请求 - Send POST request to OData service using SAP Cloud SDK version 3.2.0 SAP Cloud SDK - 访问身份验证令牌目标错误:无法读取身份验证令牌 - SAP Cloud SDK - Accessing Auth Token Destination Error: Failed to read authentication token 如何修复应用程序启动期间 SAP Cloud SDK 抛出的 DestinationAccessException - How to fix a DestinationAccessException thrown by the SAP Cloud SDK during application startup 如何为SAP Business Objects Java SDK设置Eclipse项目 - How to set up Eclipse project for SAP Business Objects Java SDK SAP Cloud SDK (Java) 在 SuccessFactors 元数据加载时引发命名错误异常 - SAP Cloud SDK (Java) throws naming error exception on SuccessFactors metadata load SAP Cloud SDK OData V4 支持 - SAP Cloud SDK OData V4 Support 在 SAP Cloud SDK 中使用 Java 为 SFSF 生成 VDM:生成的 URI 是错误的 - Generate VDM for SFSF using Java in SAP Cloud SDK: Generated URI is wrong 在Java EE中为SAP Cloud Platform使用目标 - Using destinations in Java EE for SAP Cloud Platform 如何获取用于Crystal Report的SAP BO 4.1 Service Pack 6 Java SDK的API? - How to get the API for SAP BO 4.1 Service Pack 6 Java SDK for Crystal Report?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM