[英]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.xml/maven 中添加 httpclient 库但没有运气
<dependency>
<groupId>org.restlet.jse</groupId>
<artifactId>org.restlet.ext.httpclient</artifactId>
<version>2.4.0</version>
</dependency>
你的问题是你需要为你的restlet http客户端配置一个HTTPS连接器。
我为您制作了这个简单的示例项目, restlet https 服务器/客户端示例
在此示例中,您有一个示例 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 连接器和Restlet-HTTPS 。
您也可以使用服务器/客户端资源。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.