【发布时间】:2016-12-19 11:21:59
【问题描述】:
我正在尝试使用 swagger-codgen 生成的球衣 API 库来使用 https (SSL)。
像这样只使用 http 就可以正常工作:
public ApiClient rebuildHttpClient() {
// Add the JSON serialization support to Jersey
JacksonJsonProvider jsonProvider = new JacksonJsonProvider(objectMapper);
DefaultClientConfig conf = new DefaultClientConfig();
conf.getSingletons().add(jsonProvider);
Client client = Client.create(conf);
if (debugging) {
client.addFilter(new LoggingFilter());
}
this.httpClient = client;
return this;
}
但后来我尝试像这样设置 SSL
public ApiClient rebuildHttpClient() {
// Add the JSON serialization support to Jersey
JacksonJsonProvider jsonProvider = new JacksonJsonProvider(objectMapper);
TrustManager[] byPassTrustManagers = new TrustManager[] { new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
public void checkClientTrusted(X509Certificate[] chain, String authType) { }
public void checkServerTrusted(X509Certificate[] chain, String authType) { }
} };
HostnameVerifier hostnameVerifier = HttpsURLConnection.getDefaultHostnameVerifier();
ClientConfig config = new DefaultClientConfig();
SSLContext ctx = null;
try {
ctx = SSLContext.getInstance("SSL");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
try {
ctx.init(null, byPassTrustManagers, null);
} catch (KeyManagementException e) {
e.printStackTrace();
}
config.getProperties().put(HTTPSProperties.PROPERTY_HTTPS_PROPERTIES, new HTTPSProperties(hostnameVerifier, ctx));
config.getSingletons().add(jsonProvider);
Client client = Client.create(config);
if (debugging) {
client.addFilter(new LoggingFilter());
}
this.httpClient = client;
return this;
}
它构建良好,但执行时出现此错误
Java 类 java.lang.String、Java 类型类 java.lang.String 和 MIME 媒体类型 text/html 的消息体阅读器; charset=UTF-8 未找到 08-12 13:43:41.230 12544-12861/com.xxxxxx.app.xxxxx E/ClientResponse:注册的与MIME媒体类型兼容的消息体阅读器有: / -> com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider
在我的 ApiClient 中执行此方法时(尝试进行身份验证)
private void updateParamsForAuth(String[] authNames, List<Pair> queryParams, Map<String, String> headerParams) {
for (String authName : authNames) {
Authentication auth = authentications.get(authName);
if (auth == null) throw new RuntimeException("Authentication undefined: " + authName);
auth.applyToParams(queryParams, headerParams);
}
}
当我使用 swagger-ui 测试服务器响应时,它显示它的类型是正确的 application/json
似乎与服务器端有一些事情要做?因为它在几天内运行良好,然后突然错误又回来了,而我没有更改代码客户端。
【问题讨论】: