2014-06-25 48 views
2

重定向我有這樣的一段簡單的代碼:玩! Web服務:與編碼的URL

object Main { 

    def main(args: Array[String]) { 
    val application = new DefaultApplication(new File(args(0)), this.getClass.getClassLoader, null, Mode.Prod) 
    Play.start(application) 

    val test: Future[Int] = WS.url("http://www.bestattungsvergleich.de/go/" + URLEncoder.encode("Döhren", "UTF-8")) 
     .withFollowRedirects(true) 
     .withRequestTimeout(5000) 
     .get() 
     .map(x => { 
     println(x.status) 
     x.status 
     }) 
     .recover { case e: Exception => { 
     println(e.getMessage) 
     1000 
     } 
    } 
    println(Await.result(test, Duration.Inf)) 
    Play.stop() 
    } 
} 

基本上我用Play! WS utils的,從一個網址,以獲取HTTP響應代碼,問題是,這個網址有一個臨時的重定向(它返回307)和重定向的URL時,會出現不進行編碼,這是從catch子句打印的信息:

name contains non-ascii character: lp-loaded-variation-Dᅢᄊhren 

我還嘗試過其他類型的編碼(LATIN1,一些ISO S),是我做錯了什麼或者是紅色的問題從Play!網絡服務直接檢查?

正如wingedsubmariner所指出的,lp-loaded-variation-Dᅢᄊhren作爲Set-Cookie頭部的一部分被返回。

+0

的'LP加載-變化-dㅐㅆhren'實際上正在返回部分一個'Set-Cookie'頭文件。我不知道爲什麼玩!決定扼殺這個。 – wingedsubmariner

+0

謝謝你指出。 –

+0

僅供參考,[這裏是Play郵件列表上同一問題的鏈接](https://groups.google.com/forum/#!topic/play-framework/-Wg4LOTe8BQ)。 – Carsten

回答

0

如果您遇到Play 2.2,可能會有所幫助,但這似乎適用於Play 2.3.6。添加 「com.typesafe.play」 %% 「玩-WS」 % 「2.3.6」,以build.sbt

import java.net.URLEncoder 
import play.api.libs.ws.ning._ 
import play.api.libs.ws._ 

object testing extends App { 

    override def main(args: Array[String]) { 
    implicit val context = play.api.libs.concurrent.Execution.Implicits.defaultContext 
    val config = new NingAsyncHttpClientConfigBuilder(DefaultWSClientConfig()).build() 
    val builder = new com.ning.http.client.AsyncHttpClientConfig.Builder(config) 
    val wsClient: NingWSClient = new NingWSClient(builder.build()) 
    val result = wsClient.url("http://www.bestattungsvergleich.de/go/" + URLEncoder.encode("Döhren", "UTF-8")) 
     .withRequestTimeout(3000) 
     .withFollowRedirects(true) 
     .get 
     .map { response => 
     println("Got a response") 
     println(response.body) 
     // close out properly in real application not like this 
     wsClient.underlying[com.ning.http.client.AsyncHttpClient].close; 
     System.exit(0) 
     } 
     .recover { 
     case e: Throwable => 
      println("error", e) 
      println("Couldn't open") 
     } 
    } 

}