如何在Restlet的ServerResource方法中作为客户端请求另一个api

问题描述 投票:0回答:1

我已经在Restlet 2.4.2 Java中创建了一个API,一切正常。当我尝试在ServerResource文件中作为客户端调用另一个API时,出现此错误。

这是我的调用API作为客户端代码:

Client client = new Client(new Context(), Protocol.HTTPS);
client.getContext().getParameters().add("useForwardedForHeader","false");
ClientResource cr = new ClientResource("https://www.examples.com");
try{ 
cr.get(MediaType.APPLICATION_ALL).write(System.out); 
} catch(ResourceException | IOException e) { e.printStackTrace(); }

我面临的错误:

The protocol used by this request is not declared in the list of client connectors. (HTTPS/1.1). In case you are using an instance of the Component class, check its "clients" property.

我试图在pom.xml / maven中添加httpclient库,但是没有运气

<dependency>
    <groupId>org.restlet.jse</groupId>
    <artifactId>org.restlet.ext.httpclient</artifactId>
    <version>2.4.0</version>
</dependency>
java restlet restlet-2.0 restlet-2.3.1
1个回答
1
投票

您的问题是您需要为restlet http客户端配置HTTPS连接器。

我为您制作了这个简单的示例项目restlet https server/client sample

在此示例中,您有一个示例HTTPS服务器,该服务器具有一个带有自签名证书(用于测试)的密钥库和一个配置了相同密钥库/证书的HTTPS客户端。

客户代码示例:

private static final String url = "https://localhost:8443/";

public static void main(String[] args) {
    System.out.println("Sending HTTP GET request to " + url);
    // Add your HTTPS specifications
    String file = "keystore-dev.jks";
    String keystorePwd = "localhost";
    String keyPwd = "localhost";
    File keystoreFile = new File(file);

    if (keystoreFile.exists()) {
        Request request = new Request(Method.GET, url);
        System.setProperty("javax.net.ssl.trustStore", keystoreFile.getAbsolutePath());
        System.setProperty("javax.net.ssl.trustStorePassword", keystorePwd);
        System.setProperty("javax.net.ssl.keyStore", keystoreFile.getAbsolutePath());
        System.setProperty("javax.net.ssl.keyStorePassword", keystorePwd);

        Client client = new Client(new Context(), Protocol.HTTPS);
        client.getContext().getParameters().add("sslContextFactory",
                "org.restlet.engine.ssl.DefaultSslContextFactory");
        client.getContext().getParameters().add("keystoreType", "JKS");
        client.getContext().getParameters().add("keystorePath", keystoreFile.getAbsolutePath());
        client.getContext().getParameters().add("keystorePassword", keystorePwd);
        client.getContext().getParameters().add("keyPassword", keyPwd);

        Response resp = client.handle(request);

        System.out.println("Service response code: " + resp.getStatus());
        try {
            System.out.println("Service response body: " + resp.getEntity().getText());
        } catch (IOException e) {
            System.out.println("Error reading response");
        }

    } else {
        System.err.println("Error keystore not found");
    }

}

客户端pom.xml依赖项:

<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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.github.arielcarrera</groupId>
    <artifactId>restlet-https-client</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>restlet-https-client</name>
    <url>http://maven.apache.org</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <version.restlet>2.4.0</version.restlet>
        <version.junit>4.13</version.junit>
    </properties>

    <repositories>
        <repository>
            <id>maven-restlet</id>
            <name>Restlet repository</name>
            <url>https://maven.restlet.com</url>
        </repository>
    </repositories>

    <dependencies>
        <dependency>
            <groupId>org.restlet.jse</groupId>
            <artifactId>org.restlet.ext.httpclient</artifactId>
            <version>${version.restlet}</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${version.junit}</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

用于创建测试密钥库的示例命令行:

keytool -genkey -alias localhost -keyalg RSA -keysize 2048 -keypass localhost -storepass localhost -keystore keystore-dev.jks

有关更多信息,请阅读有关Restlet- Client connectorsRestlet - HTTPS

您也可以使用Server/Client Resources

希望有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.