2017-01-04 46 views
5

我試圖讓使用Groovy的toURL()方法Grails的http請求:忽略SSL錯誤,與常規的方法的toURL

def holidayApiUrl = "https://holidayapi.com/v1/holidays?key=${apiKey}&year=2016&country=US" 

def holidayJson = JSON.parse(holidayApiUrl.toURL().text) 

您可以從holidayapi.com獲得API密鑰複製此錯誤。

以上要求給

PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 

所以我在尋找方法完全忽視使用常規此方法SSL錯誤。但無法獲得它。

其他SO帖子建議像this這樣的東西,但groovy的toURL不使用SSLContext。那麼是否可以使用toURL()忽略ssl錯誤?

編輯:

任何人想測試上面的代碼片段可以註冊免費爲holidaypi.com並獲得API密鑰。上面的url(用api鍵替換)在瀏覽器中打開時會給出正確的json。但上面的代碼在groovy中執行時會出現SSL錯誤。

回答

0

對於使用Groovy處理JSON,適用於我的沒有問題的更好方法是使用groovy.json.JsonSlurper類。使用JsonSlurper代碼的修改版本應該工作:

import groovy.json.* 

def holidayApiUrl = "https://holidayapi.com/v1/holidays?key=${apiKey}&year=2016&country=US".toURL() 

//Returns an instance of a Map 
def holidayJson = new JsonSlurper().parse(holidayApiUrl) 

//Make it pretty and print 
println JsonOutput.prettyPrint(JsonOutput.toJson(holidayJson)) 
+0

是你確定這有效嗎?對我來說,這仍然給我SSL握手錯誤。我會建議你從holidayapi.com獲得api密鑰(免費獲得)並測試此代碼。 – rahulserver

+0

我確實得到了一個關鍵,它爲我工作。 – pczeus

1

你叫

def holidayJson = new JsonSlurper().parse(holidayApiUrl) 

嘗試做以下就在(此創建並註冊替代的TrustManager):

import javax.net.ssl.SSLContext; 
import javax.net.ssl.X509TrustManager; 
import javax.net.ssl.HttpsURLConnection; 

class TrustManager implements X509TrustManager { 
    public java.security.cert.X509Certificate[] getAcceptedIssuers() { return null; } 
    public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) { } 
    public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) { } 
} 

TrustManager[] trustAllCerts = new TrustManager[1] 
trustAllCerts[0] = new TrustManager() 
SSLContext sc = SSLContext.getInstance("SSL"); 
sc.init(null, trustAllCerts, new java.security.SecureRandom()); 
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); 
+0

這工作得非常好 - 感謝這個解決方案+1。 'sslContext.init(null,(TrustManager [])[new TrustManager()],新的java.security.SecureRandom())' – Trinimon