Android SSLPeerUnverifiedException OkHttp?
我正在尝试使用OkHttp库向API发送带有一些url参数的post请求。到目前为止,我有以下代码:Android SSLPeerUnverifiedException OkHttp?,android,ssl,okhttp,Android,Ssl,Okhttp,我正在尝试使用OkHttp库向API发送带有一些url参数的post请求。到目前为止,我有以下代码: public String okHttpRequest() throws IOException{ OkHttpClient client = new OkHttpClient(); OkHttpClient.Builder builder = new OkHttpClient.Builder(); builder.hostnameVer
public String okHttpRequest() throws IOException{
OkHttpClient client = new OkHttpClient();
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.hostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
HttpUrl.Builder urlBuilder = HttpUrl.parse("myurl").newBuilder();
urlBuilder.addQueryParameter("username","username");
urlBuilder.addQueryParameter("password","7777");
String url = urlBuilder.build().toString();
Request request = new Request.Builder()
.url(url)
.build();
//HERE EXCEPTION IS THROWN
Response response = client.newCall(request).execute();
return response.body().string();
}
例外情况是:
javax.net.ssl.SSLPeerUnverifiedException:主机名{domain}未验证:
显然您试图连接到ssl网站(https),因此需要在小代码段下面添加一个SSLSocketFactory
OkHttpClient client = new OkHttpClient();
client.setHostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
有关更多详细信息,请参阅此或,它应该对您有所帮助
如果您想“信任所有证书”,请参阅示例,但建议不要使用该示例,它只能用于测试目的 检查SSLSession主机名和连接主机名
OkHttpClient client = new OkHttpClient();
client.setHostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
if (!urlHostName.equalsIgnoreCase(session.getPeerHost())) {
System.out.println("Warning: URL host '" + urlHostName
+ "' is different to SSLSession host '"
+ session.getPeerHost() + "'.");
}
return true;
}
});
更新
com.squareup.okhttp3:okhttp:3.0.1的代码
mTextView = (TextView) findViewById(R.id.textView);
mHandler = new Handler(Looper.getMainLooper());
final Request request = new Request.Builder()
.url("https://...")
.post(formBody)
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, final IOException e) {
Log.e(LOG_TAG, e.toString());
mHandler.post(new Runnable() {
@Override
public void run() {
String message = request.toString() + "\r\n" + e.toString();
mTextView.setText(message);
}
});
}
@Override
public void onResponse(Call call, Response response) throws IOException {
try {
JSONObject jsonObject = new JSONObject(response.body().string());
final String message = jsonObject.toString(5);
Log.i(LOG_TAG, message);
mHandler.post(new Runnable() {
@Override
public void run() {
mTextView.setText(message);
}
});
} catch (JSONException e) {
e.printStackTrace();
}
}
});
因为您的项目使用了OkHttp v3.0.0-RC1,所以要修复该异常,您的代码应该如下示例所示:
OkHttpClient client = new OkHttpClient.Builder()
.hostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
})
.build();
Request request = new Request.Builder()
.url("https://...")
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(final Request request, final IOException e) {
// do something...
}
@Override
public void onResponse(Response response) throws IOException {
// do something...
}
});
但是,不是而是返回true代码>以上,我建议您阅读谷歌的文档了解更多信息
另一个有用的链接是
希望有帮助
p/S:请注意,我使用OkHttp的异步方式(在client.newCall(request).enqueue(new Callback()…),您也可以使用同步方式作为您的代码。@Alvin请参阅我的编辑,但这只是代码的一部分,请查看链接以了解SSL实现的更多详细信息。为什么无法解析setHostnameVerifier?@nurisezginOkHttpclient api“sethostnameverifier“此链接中的方法原型非常棒@BNK!请求现在被发送到一个测试url进行post请求。如何向请求url添加参数?/login?username=alvin&password=2186等@alvin关于参数,您可以阅读更多信息,https@BNK有什么特别的东西吗?因为当我尝试请求我的url(https)时,它失败了。”,但使用一些测试url()一切都正常。我接受它;)您的httpbin…
响应{“origin”:“118.69.226.223”}
?那是你的网址吗?关于失败,错误消息是什么?我认为问题在于没有添加方法()。补充说,;Request Request=newrequest.Builder().url(“myPrivateAPIurl”).method(“POST”,??).build();该方法应采用RequestBody,而不是问号@BNK。