2013-10-18 7 views
12

निम्नलिखित कोड उपयोगकर्ता को प्रमाणित नहीं करता है (कोई प्रमाणीकरण विफलता होता है, लेकिन कॉल अनुमतियों की कमी के कारण विफल रहता है):HTTPBilder मूल लेख क्यों काम नहीं कर रहा है?

def remote = new HTTPBuilder("http://example.com") 
remote.auth.basic('username', 'password') 
remote.request(POST) { req -> 
    uri.path = "/do-something" 
    uri.query = ['with': "data"] 

    response.success = { resp, json -> 
     json ?: [:] 
    } 
} 

लेकिन निम्नलिखित ठीक काम करता है:

def remote = new HTTPBuilder("http://example.com") 
remote.request(POST) { req -> 
    uri.path = "/do-something" 
    uri.query = ['with': "data"] 
    headers.'Authorization' = 
       "Basic ${"username:password".bytes.encodeBase64().toString()}" 

    response.success = { resp, json -> 
     json ?: [:] 
    } 
} 

क्यों प्रतिसाद नहीं पहले काम नहीं कर रहे हैं?

+2

यह कैसे असफल रहा है? बुनियादी प्रमाणीकरण को ट्रिगर करने के लिए सर्वर को HTTP 401 स्थिति कोड वापस करना चाहिए। एचटीपीबिल्डर फिर प्राधिकरण शीर्षलेख के साथ दूसरा अनुरोध भेज देगा। – ataylor

+0

यह अभी काम नहीं करता है। अनुरोध स्वयं एक संदेश के साथ लौटाता है कि उपयोगकर्ता को ऑपरेशन करने की अनुमति नहीं है। मैं उपयोगकर्ता नाम और पासवर्ड को पूरी तरह से अमान्य में बदल सकता हूं और वही होता है। –

+2

यह संभावित रूप से आपकी समस्या को हल करना चाहिए http://stackoverflow.com/questions/6588256/using-groovy-http-builder-in-preemptive-mode –

उत्तर

0

ऐसा लगता है कि आपका सर्वर पूरी तरह से HTTPBuilder-compilant नहीं है। यह इस स्थिति को पकड़ने और प्रमाणीकरण अनुरोध पुनः भेजने के लिए HTTPBuilder के लिए 401 कोड (जो आरईएसटी सर्वर के लिए स्टैंडअर्ट व्यवहार है, लेकिन दूसरों के लिए गैर-स्टैंडअर्ट है) लौटा देना चाहिए। Here इसके बारे में लिखा गया है।

1

दो चीजें जिन्हें मैं अपने सिर के ऊपर से सोच सकता हूं।

.setHeaders विधि के लिए एक मानचित्र की आवश्यकता है। क्या आपने
'Authorization' : "Basic ${"username:password".bytes.encodeBase64().toString()}" को आजमाया है?

यदि नहीं, तो यह थोड़ा और काम और कोड है, लेकिन आप उपयोगकर्ता को URIBuilder भी उपयोगकर्ता बना सकते हैं। आम तौर पर मैं

protected final runGetRequest(String endpointPassedIn, RESTClient Client){ 
     URIBuilder myEndpoint = new URIBuilder(new URI(Client.uri.toString() + endpointPassedIn)) 
     HttpResponseDecorator unprocessedResponse = Client.get(uri: myEndpoint) as HttpResponseDecorator 
     def Response = unprocessedResponse.getData() as LazyMap 
     return Response 
} 

आशा एक अलग वर्ग के लिए संपुटित इस मदद करता है

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