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

how to request another api as Client in ServerResource method in Restlet

我在 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 中添加 httpclient 库。xml/maven 但没有成功

<dependency>
    <groupId>org.restlet.jse</groupId>
    <artifactId>org.restlet.ext.httpclient</artifactId>
    <version>2.4.0</version>
</dependency>

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

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

在此示例中,您有一个带有密钥库的示例 HTTPS 服务器和一个自签名证书(用于测试目的)和一个具有相同 keystore/certificate 配置的 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 connectors and Restlet - HTTPS

您也可以使用 Server/Client Resources