2013-06-09 6 views
7

Próbuję wykonać proste żądanie https przy użyciu tej biblioteki https://github.com/scalaj/scalaj-http. Żądanie zawiera pewne dane json.SocketTimeoutException podczas korzystania z żądania Scalaj

Oto co robię:

val jsonHeaders = """{"jsonrpc": "2.0", "method": "someMethod", "params": {"dataIds":["12348" , "456"]}, "data2": "777"}""" 

    val result = Http.postData("https://someurl.com/json-rpc", jsonHeaders) 
    .header("content-type", "application/json") 
    .header("X-Application", "myCode") 
    .header("X-Authentication", "myCode2") 
    .option(HttpOptions.readTimeout(10000)) 
    .asString 
    //.responseCode -- the same error 

    println(result) 

I zawsze zwraca mi błąd timeout:

[error] (run-main) java.net.SocketTimeoutException: connect timed out 
java.net.SocketTimeoutException: connect timed out 
    at java.net.PlainSocketImpl.socketConnect(Native Method) 
    at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source) 
    at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source) 
    at java.net.AbstractPlainSocketImpl.connect(Unknown Source) 
    at java.net.SocksSocketImpl.connect(Unknown Source) 
    at java.net.Socket.connect(Unknown Source) 
    at sun.security.ssl.SSLSocketImpl.connect(Unknown Source) 
    at sun.net.NetworkClient.doConnect(Unknown Source) 
    at sun.net.www.http.HttpClient.openServer(Unknown Source) 
    at sun.net.www.http.HttpClient.openServer(Unknown Source) 
    at sun.net.www.protocol.https.HttpsClient.<init>(Unknown Source) 
    at sun.net.www.protocol.https.HttpsClient.New(Unknown Source) 
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(Unknown Source) 
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source) 
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source) 
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(Unknown Source) 
    at scalaj.http.Http$$anonfun$3.apply(Http.scala:263) 
    at scalaj.http.Http$$anonfun$3.apply(Http.scala:261) 
    at scalaj.http.Http$Request.process(Http.scala:102) 
    at scalaj.http.Http$Request.apply(Http.scala:90) 
    at scalaj.http.Http$Request.asString(Http.scala:133) 
    at Application$delayedInit$body.apply(Application.scala:27) 
    at scala.Function0$class.apply$mcV$sp(Function0.scala:40) 
    at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12) 
    at scala.App$$anonfun$main$1.apply(App.scala:71) 
    at scala.App$$anonfun$main$1.apply(App.scala:71) 
    at scala.collection.immutable.List.foreach(List.scala:318) 
    at scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:32) 
    at scala.App$class.main(App.scala:71) 
    at Application$.main(Application.scala:8) 
    at Application.main(Application.scala) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
[trace] Stack trace suppressed: run last compile:run for the full output. 
java.lang.RuntimeException: Nonzero exit code: 1 
    at scala.sys.package$.error(package.scala:27) 

Jeśli robię tylko

val jsonHeaders = """{"version123": "12.0", "method": "someMethod", "params": {"dataIds": ["12348" , "456"]}, "data2": "777"}""" 
val result = Http.postData("https://someurl.com/some-url2", jsonHeaders) 
     .header("content-type", "application/json") 
     .header("X-Application", "myCode") 
     .header("X-Application1234", "myCode2") 
     .option(HttpOptions.readTimeout(10000)) 
println(result) 

zwraca

Request(POST,<function2>,<function1>,List(),List((X-Authentication,myCode2), (X-Application1234,myCode), (content-type,application/json)),List(<function1>, <function1>, <function1>),DIRECT) 

Co mam zrobić źle i czy istnieje inny prosty sposób wysłania żądania https? Nawet jeśli dotyczy to ramek spray, byłoby ok (nie znalazłem żadnego przykładu, jak to zrobić w spray).

UPDATE:

Przykładem został wzięty stąd Doing HTTP request in Scala

+0

Wygląda drugiego wniosku nie wykonywać żadnej rzeczywistej żądanie - po prostu buduje obiekt żądania, które następnie uzyskać wyzwolone przez 'asString'. Czy na pewno żądanie to może zostać spełnione w określonym limicie czasu (np. Czy próbowałeś zrobić to samo z zawijaniem). –

+0

@ om-nom-nom Mogę skomentować limit czasu i nic się w ogóle nie zmieni. –

+0

@ Om-nom-nom spójrz na moją aktualizację. Mogę również wykonać tę prośbę w Pythonie i będzie działać dobrze. –

Odpowiedz

11

musisz określić limit czasu połączenia obok aktualnego limitu czasu odczytu z: .option(HttpOptions.connTimeout(10000)).option(HttpOptions.readTimeout(50000)). Zmień wartość 10000 na wartość, która Ci odpowiada. Domyślny limit czasu połączenia jest dość agresywny: 100.

Podano już określony czas oczekiwania, ale wyjątek mówi, że upłynął czas oczekiwania na nawiązanie połączenia, a nie na odczyt odpowiedzi.

Zobacz docs: https://github.com/scalaj/scalaj-http#custom-connect-and-read-timeouts

+0

to nie pomogło. Nawet jeśli zwiększę wartość 60000 10 razy, wydaje się, że przymyka na to oko - nie ma żadnej różnicy, co oznacza, że ​​istnieje z błędem tak szybko, jak wcześniej. –

+0

może pomyliłem rozkaz argumentów? –

+0

Dziwne. Wystarczy sprawdzić: określasz zarówno 'HttpOptions.readTimeout' i' HttpOptions.connTimeout'? Nie sądzę, że zamówienie powinno coś zmienić. Oto przykład wykorzystania obu: https://github.com/theon/xsbt-coveralls-plugin/blob/master/src/main/scala/com/github/theon/coveralls/CoverallsClient.scala# L48. – theon