2013-10-18 66 views
12

下面的代碼不驗證用戶(無身份驗證失敗情況發生,但調用失敗,由於缺乏權限):爲什麼HTTPBuilder基本身份驗證不起作用?

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 ?: [:] 
    } 
} 

爲什麼ISN第一個工作嗎?

+2

它是如何失敗?服務器應該返回一個HTTP 401狀態碼來觸發基本認證。然後HttpBuilder將發送第二個請求和授權標頭。 – ataylor

+0

它只是不起作用。請求本身會返回一條消息,指出用戶沒有執行該操作的權限。我可以將用戶名和密碼更改爲完全無效的內容,併發生相同的情況。 –

+2

這應該有可能解決您的問題 http://stackoverflow.com/questions/6588256/using-groovy-http-builder-in-preemptive-mode –

回答

0

看起來你的服務器並不完全是HTTPBuilder編譯器。它應該返回401代碼(這是REST服務器的標準行爲,但對於其他標準不是標準行爲),以便HTTPBuilder捕獲此狀態並重新發送認證請求。 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 
} 

希望這有助於

相關問題