0

I have created a API in Restlet 2.4.2 java everything is working fine. I get this error when I try to call another API as a client in my ServerResource file.

here is my calling API as client code:

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(); }

Error I'm facing:

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.

I Tried to add httpclient library in pom.xml/maven but no luck

<dependency>
    <groupId>org.restlet.jse</groupId>
    <artifactId>org.restlet.ext.httpclient</artifactId>
    <version>2.4.0</version>
</dependency>
Mahmood Sanjrani
  • 156
  • 2
  • 17

1 Answers1

2

Your problem is that you need to configure an HTTPS Connector to your restlet http client.

I made this simple sample project for you restlet https server/client sample

In this sample, you have a sample HTTPS server with a keystore with a self-signed certificate (for testing purpose) and an HTTPS client with same keystore/certificate configured.

Client code sample:

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");
    }

}

Client pom.xml dependencies:

<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>

Sample command line to create a test keystore:

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

For more information, read about Restlet- Client connectors and Restlet - HTTPS.

You can use Server/Client Resources too.

Dharman
  • 21,838
  • 18
  • 57
  • 107
Ariel Carrera
  • 4,603
  • 17
  • 33
  • Carrera Thank you, I have a confusion, do I need to use certificate for non ssl client request? – Mahmood Sanjrani Feb 24 '20 at 05:36
  • 1
    no, for http calls you don't need a ssl certificate. In your question, the target url starts with "https" (https://www.examples.com), so in this case, your client needs a https connector registered with the ssl certificate in his trust store (keystore). If your server expose port 80 (http), the you can connect omiting ssl configurations (but keep in mind that the connection will be insecure) – Ariel Carrera Feb 24 '20 at 07:03