2016-01-08 49 views
1

我試圖使用OkHttp庫發送請求API與一些URL參數。繼this blog post我有這樣的代碼至今:SSLPeerUnverifiedException OkHttp?

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: Hostname {domain} not verified:

回答

3

UPDATE

代碼​​3210

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... 
      } 
     }); 

然而,除了上述return true;,我建議你閱讀谷歌的文檔有關Common Problems with Hostname Verification更多信息。

一個更有用的鏈接是OkHttp's HTTPS wiki

希望它有幫助!

P/S:請注意,我用OkHttp(異步的方式在client.newCall(請求).enqueue(新的回調()......),你也可以使用同步方式的代碼

+0

你真是太好了@BNK!請求現在被髮送到測試網址以獲取發佈請求。可以添加參數來請求url?/ login?username = alvin&password = 2186等 – Alvin

+0

IMO,你應該閱讀https://github.com/square/okhttp/wiki/Recipes – BNK

+0

@Alvin參數,你可以閱讀更多在http://stackoverflow.com/questions/30142626/how-to-add- query-parameters-to-a-http-get-request-by-okhttp – BNK

1

顯然,你試圖連接到一個SSL網站(HTTPS),因此,你需要添加一個SSLSocketFactory,下面的小代碼片段。

OkHttpClient client = new OkHttpClient(); 
client.setHostnameVerifier(new HostnameVerifier() { 
      @Override 
      public boolean verify(String hostname, SSLSession session) { 
       return true; 
      } 
     }); 

欲瞭解更多詳情,請參閱本pagethis,它應該幫助你。

如果你想「信任所有證」,看到this的例子,但它`建議報告,並應僅用於測試目的

+1

。無法解析方法setHostnameVerifier – Alvin

+0

@Alvin看到我的編輯,但這只是代碼的一部分,請參閱SSL實現的更多細節的鏈接 – Simon

0

檢查的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; 
      } 
     }); 
+0

爲什麼setHostnameVerifier無法解析?@nurisezgin – Alvin

+0

OkHttpclient api「sethostnameverifier」方法原型in這個鏈接https://square.github.io/okhttp/2.x/okhttp/com/squareup/okhttp/OkHttpClient.html – nurisezgin