2017-01-04 60 views
5

próbuję uczynić żądania http przy użyciu toURL() metodę Groovy w Grails:Ignoruj ​​błędy SSL z Groovy za toURL metody

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

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

można dostać klucze API z holidayapi.com powtórzyć tego błędu.

Przede żądanie daje

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

Więc szukałem sposobów ignorowania błędów SSL całkowicie przy użyciu tej metody w Groovy. Ale nie jest w stanie tego zdobyć.

Inne pozycje SO sugerują rzeczy takie jak this, ale toURL groovy nie używa SSLContext. Czy można zignorować błędy ssl za pomocą funkcji toURL()?

EDIT:

Każdy, kto chce przetestować powyższy fragment kodu może Dołącz za darmo do holidaypi.com i zdobyć klucz API. Adres URL powyżej (zastąpiony klawiszem APi) po naciśnięciu w przeglądarce daje właściwy json. Ale powyższy kod daje błąd SSL po uruchomieniu w groovy.

Odpowiedz

0

Do przetwarzania JSON z Groovy, Lepszym podejściem, które działa dla mnie bez problemu, jest użycie klasy groovy.json.JsonSlurper. Zmodyfikowana wersja kodu przy użyciu JsonSlurper powinno działać:

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

Czy jesteś pewien, że to działa? Dla mnie to nadal daje mi błąd uzgadniania SSL. Polecam, aby zdobyć klucz api (darmowy dostęp) z holidayapi.com i przetestować ten kod. – rahulserver

+0

Zdobyłem klucz, zadziałało to dla mnie. – pczeus

1

Tuż przed wywołaniem

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

Spróbuj zrobić następujące (to tworzy i rejestruje alternatywną 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

To działa całkiem dobrze - dzięki za to rozwiązanie +1. Nieco krótszy "sslContext.init" (null, (TrustManager []) [nowy TrustManager()], new java.security.SecureRandom()) ' – Trinimon