2017-01-04 15 views
5

साथ SSL त्रुटियों पर ध्यान न दें मैं grails में ग्रूवी के toURL() पद्धति का उपयोग करके http अनुरोध बनाने के लिए कोशिश कर रहा हूँ:ग्रूवी के toURL विधि

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

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

आपको यह त्रुटि को दोहराने के लिए holidayapi.com से एपीआई कुंजी प्राप्त कर सकते हैं।

अनुरोध ऊपर

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

देता है तो मैं तरीके SSL त्रुटियाँ पूरी तरह से ग्रूवी में इस पद्धति का उपयोग की अनदेखी करने के लिए खोज रहा था। लेकिन इसे पाने में सक्षम नहीं है।

अन्य SO पोस्ट this जैसी चीजों का सुझाव देते हैं लेकिन groovy's toURL SSLContext का उपयोग नहीं करता है। तो toURL() का उपयोग कर एसएसएल त्रुटियों को अनदेखा करना संभव है?

संपादित करें:

किसी को भी कोड टुकड़ा ऊपर का परीक्षण करने के लिए इच्छुक holidaypi.com के लिए मुफ्त साइनअप और api कुंजी प्राप्त कर सकते हैं। ब्राउज़र में हिट होने पर उपरोक्त यूआरएल (एपीआई कुंजी के साथ बदला गया) उचित जेसन देता है। लेकिन ग्रोवी में निष्पादित होने पर उपरोक्त कोड एसएसएल त्रुटि देता है।

उत्तर

0

ग्रोवी के साथ जेएसओएन प्रोसेसिंग के लिए, एक बेहतर दृष्टिकोण जो बिना किसी मुद्दे के मेरे लिए काम करता है 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

हैं आपको यकीन है कि यह काम करता है? मेरे लिए यह अभी भी मुझे एसएसएल हैंडशेक त्रुटि देता है। मैं आपको vacationapi.com से एपीआई कुंजी (प्राप्त करने के लिए स्वतंत्र) प्राप्त करने और इस कोड का परीक्षण करने की सलाह दूंगा। – 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 (शून्य, (ट्रस्टमैनेजर []) [नया ट्रस्टमैनेजर()], नया जावा। सिक्योरिटी। सुरक्षितरैंडम()) ' – Trinimon

संबंधित मुद्दे