2016-05-03 11 views
2

Ich bin auf Play 2.2.x und habe die folgende Code-snippet:Play WS Exception: java.lang.IllegalArgumentException: name enthält eines der folgenden verbotenen Zeichen: =,;: t r n v f: Agent,

def call(server: String, api: String) = { 
    import play.api.libs.ws._ 
    import scala.concurrent.Await 
    import scala.concurrent.duration._ 
    val request = WS.url(server + api) 
    Await.result(request.get(), 1 minute) 
} 

ich diese Störung erhalte:

java.lang.IllegalArgumentException: name contains one of the following prohibited characters: =,;: \t\r\n\v\f: Agent, 
     at org.jboss.netty.handler.codec.http.HttpCodecUtil.validateHeaderName(HttpCodecUtil.java:38) 
     at org.jboss.netty.handler.codec.http.HttpHeaders.validateHeaderName(HttpHeaders.java:834) 
     at org.jboss.netty.handler.codec.http.HttpHeaders.addHeader(HttpHeaders.java:838) 
     at org.jboss.netty.handler.codec.http.DefaultHttpMessage.addHeader(DefaultHttpMessage.java:44) 
     at org.jboss.netty.handler.codec.http.HttpMessageDecoder.readHeaders(HttpMessageDecoder.java:496) 
     at org.jboss.netty.handler.codec.http.HttpMessageDecoder.decode(HttpMessageDecoder.java:193) 
     at org.jboss.netty.handler.codec.http.HttpClientCodec$Decoder.decode(HttpClientCodec.java:143) 
     at org.jboss.netty.handler.codec.http.HttpClientCodec$Decoder.decode(HttpClientCodec.java:127) 
     at org.jboss.netty.handler.codec.replay.ReplayingDecoder.callDecode(ReplayingDecoder.java:500) 
     at org.jboss.netty.handler.codec.replay.ReplayingDecoder.messageReceived(ReplayingDecoder.java:435) 
     at org.jboss.netty.handler.codec.http.HttpClientCodec.handleUpstream(HttpClientCodec.java:92) 
     at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:296) 
     at org.jboss.netty.handler.codec.frame.FrameDecoder.unfoldAndFireMessageReceived(FrameDecoder.java:462) 
     at org.jboss.netty.handler.codec.frame.FrameDecoder.callDecode(FrameDecoder.java:443) 
     at org.jboss.netty.handler.codec.frame.FrameDecoder.messageReceived(FrameDecoder.java:303) 
     at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:268) 
     at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:255) 
     at org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:88) 
     at org.jboss.netty.channel.socket.nio.AbstractNioWorker.process(AbstractNioWorker.java:109) 
     at org.jboss.netty.channel.socket.nio.AbstractNioSelector.run(AbstractNioSelector.java:312) 
     at org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:90) 
     at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:178) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
     at java.lang.Thread.run(Thread.java:745) 

Was mache ich falsch? Die server + api hat keinerlei Sonderzeichen.

auch nicht sicher, warum dies so ausführlich ist in Scala zu tun - warum die API erfordern mir 3 Dinge zu importieren einen einfachen GET Anruf zu machen ...

EDIT: Bestätigte dies geschieht, wenn Server https://example.com ist aber nicht, wenn es http ist: http://example.com

Antwort

1

Der Stacktrace zeigt an, dass Ihr Server (Beispiel.com) mit illegalen HTTP-Header reagiert. Nämlich sendet Agent, als Header-Name zurück. Beachten Sie die Komma im Text.

Zur Frage, warum es in scala so ausführlich ist - das Problem Ihres Codes ist, dass es versucht, die asynchrone Art der Web-Service-API von play-framework an die synchrone call-Funktion anzupassen. So arbeiten Sie normalerweise nicht mit Scalas Future API.