2013-06-09 34 views
7

Tôi đang cố thực hiện một yêu cầu https đơn giản bằng cách sử dụng thư viện này https://github.com/scalaj/scalaj-http. Yêu cầu chứa một số dữ liệu json.SocketTimeoutException khi tôi sử dụng yêu cầu Scalaj

Đây là những gì tôi đang làm:

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) 

Và nó luôn luôn trả tôi một lỗi thời gian chờ:

[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) 

Nếu tôi làm chỉ

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) 

nó trả

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

Tôi làm gì sai và có cách nào khác đơn giản để gửi yêu cầu https không? Ngay cả khi liên quan đến khuôn khổ spray, nó sẽ là ok (tôi không tìm thấy bất kỳ ví dụ về cách làm điều đó trong spray, mặc dù).

CẬP NHẬT:

Một ví dụ đã được lấy từ đây Doing HTTP request in Scala

+0

Dường như yêu cầu thứ hai của bạn không làm bất cứ yêu cầu thực tế - nó chỉ xây dựng đối tượng yêu cầu, sau đó được kích hoạt bởi 'asString'. Bạn có chắc chắn rằng yêu cầu có thể được thực hiện trong khoảng thời gian chờ đã chỉ định (ví dụ: bạn đã cố gắng thực hiện tương tự với curl). –

+0

@ om-nom-nom Tôi có thể nhận xét thời gian chờ và không có gì thay đổi. –

+0

@ om-nom-nom nhìn vào bản cập nhật của tôi. Tôi cũng có thể thực hiện yêu cầu này bằng Python và nó sẽ hoạt động tốt. –

Trả lời

11

Bạn cần phải xác định một thời gian chờ kết nối cùng với thời gian chờ đọc hiện tại của bạn với: .option(HttpOptions.connTimeout(10000)).option(HttpOptions.readTimeout(50000)). Thay đổi 10000 thành giá trị phù hợp với bạn. Thời gian chờ kết nối mặc định là khá 100.

Bạn đã chỉ định thời gian chờ đã đọc, nhưng ngoại lệ cho biết đã hết thời gian để thiết lập kết nối, chứ không phải khi đọc phản hồi.

Xem tài liệu: https://github.com/scalaj/scalaj-http#custom-connect-and-read-timeouts

+0

nó không giúp ích gì. Ngay cả khi tôi tăng 60000 10 lần, có vẻ như nó nhắm mắt làm ngơ với nó - không có sự khác biệt chút nào, có nghĩa là nó tồn tại với lỗi quá nhanh như trước đây. –

+0

có lẽ tôi đã nhầm lẫn trật tự của đối số? –

+0

Lạ. Chỉ cần kiểm tra: bạn đang chỉ định cả một 'HttpOptions.readTimeout' và' HttpOptions.connTimeout'? Tôi không nghĩ rằng thứ tự nên tạo ra bất kỳ sự khác biệt nào. Dưới đây là ví dụ về cách tôi đã sử dụng cả hai: https://github.com/theon/xsbt-coveralls-plugin/blob/master/src/main/scala/com/github/theon/coveralls/CoverallsClient.scala# L48. – theon