【问题标题】:Reader for MIME media type text/html; charset=UTF-8 was not foundMIME 媒体类型 text/html 的阅读器; charset=UTF-8 未找到
【发布时间】: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

似乎与服务器端有一些事情要做?因为它在几天内运行良好,然后突然错误又回来了,而我没有更改代码客户端。

【问题讨论】:

    标签: java android ssl jersey


    【解决方案1】:

    这些代码并没有显示实际做了什么,但看看错误消息,我猜你的客户端试图调用服务器并得到一个 html 响应。您的客户不知道如何解码此响应。我建议你在浏览器中调用 URL 看看会发生什么。 您可能调用了错误的 url,或者您可能需要在调用中提供身份验证凭据。

    【讨论】:

    • 没有凭据,我已经成功地针对模拟 API 进行了测试。
    【解决方案2】:

    这是服务器端的问题。服务器出现问题时会发生接缝,我不是后端开发人员,所以我无法判断是什么问题。

    【讨论】:

      猜你喜欢
      • 2016-06-14
      • 2018-01-11
      • 2017-07-13
      • 1970-01-01
      • 1970-01-01
      • 2012-05-12
      • 1970-01-01
      • 1970-01-01
      • 2019-01-21
      相关资源
      最近更新 更多