我尝试使用Retrofit来调用此api:https://api.wheretheiss.at/v1/satellites/25544
以下是建立连接的代码:
retrieveButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASEURL)
.addConverterFactory(GsonConverterFactory.create())
.build();
ISSApi api = retrofit.create(ISSApi.class);
Call<ISS> ISS = api.getLocation();
ISS.enqueue(new Callback<ISS>() {
@Override
public void onResponse(Response<ISS> response) {
System.out.println("booya");
}
@Override
public void onFailure(Throwable t) {
System.out.println("failure");
System.out.println(t.getMessage().toString());
t.printStackTrace();
}
});
所以它似乎至少能够找到API,因为onFailure回调被触发,但是我得到了这个错误:
javax.net.ssl.SSLHandshakeException:java.security.cert.CertPathValidatorException:找不到证书路径的信任锚。
一些说明: 之前我使用过具有SSL功能的API的OkHTTP,我从来没有处理过证书。此外,我注意到,如果我去Nexus 5上的API端点,我得到这个:http://i.imgur.com/he8821o.png。也许这与问题有关?
任何帮助表示赞赏。使用Retrofit 2.0.0。
答案 0 :(得分:1)
您尝试连接的服务器没有适用于Android的有效SSL证书。
这很奇怪,因为我可以在我的计算机上访问它而没有任何问题,但显然 Android缺少签署此证书的CA 。
你能做什么:
SslSocketFactory
。第二种方法是最好的,但它带来了很多问题。
例如,如果服务器更改了证书(它们通常会不时更改),则每次更新应用程序时都会收到相同的错误。 另一种方法是找到谁是此服务器证书的证书颁发机构,然后添加它(它适用于#1和#2)。
检查this answer以了解如何使用OkHttp覆盖证书验证。
编辑:证书颁发者似乎 RapidSSL (信息here)。