2017-01-04 15 views
5

SSL hataları yoksay Ben grails içinde Groovy toURL() yöntemi kullanarak http isteği yapmaya çalışıyorum:Groovy toURL yöntemiyle

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

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

bu hatayı çoğaltmak için holidayapi.com gelen API anahtarlarını alabilirsiniz. İsteğe Üstü

Yani tamamen harika bu yöntemi kullanarak SSL hataları görmezden yollarını arıyordu

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

verir. Ama onu elde edemiyorum.

Diğer SO iletileri, this gibi şeyler önerir, ancak groovy's toURL SSLContext'i kullanmaz. Yani toURL() kullanarak ssl hatalarını göz ardı etmek mümkün mü?

DÜZENLEME: kod parçası üzerinde test etmek isteyen

Herkes holidaypi.com için ücretsiz kaydolmaya ve API anahtarını alabilirsiniz. Tarayıcıda vurulduğunda yukarıdaki URL (api tuşu ile değiştirilir) doğru jsonu verir. Ancak yukarıdaki kod, groovy'de yürütüldüğünde SSL hatası verir.

cevap

0

Groovy ile JSON'u işlemek için, benim için sorunsuz çalışan daha iyi bir yaklaşım, groovy.json.JsonSlurper sınıfını kullanmaktır. JsonSlurper kullanarak kod modifiye edilmiş versiyonu çalışması gerekir:

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

Are Bunun işe yaradığından emin misin? Benim için hala SSL el sıkışma hatası veriyor. Holidayapi.com'dan bir api anahtarı (almayı ücretsiz) almanızı ve bu kodu test etmenizi tavsiye ederim. – rahulserver

+0

Bir anahtar aldım, benim için çalıştı. – pczeus

1

aşağıdakileri yapmanız

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

deneyin diyoruz hemen önce (bu oluşturur ve alternatif TrustManager kaydeder):

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

Bu oldukça iyi çalışıyor - bu çözüm için teşekkürler +1. Biraz daha kısa sslContext.init (null, (TrustManager []) [yeni TrustManager()], yeni java.security.SecureRandom()) – Trinimon