Json 使用Scalaj请求时的SocketTimeoutException

Json 使用Scalaj请求时的SocketTimeoutException,json,scala,httprequest,spray,Json,Scala,Httprequest,Spray,我正试图使用这个库发出一个简单的https请求。该请求包含一些json数据 以下是我正在做的: val jsonHeaders = """{"jsonrpc": "2.0", "method": "someMethod", "params": {"dataIds":["12348" , "456"]}, "data2": "777"}""" val result = Http.postData("https://someurl.com/json-rpc", jsonHeaders)

我正试图使用这个库发出一个简单的https请求。该请求包含一些json数据

以下是我正在做的:

  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)
它总是返回一个超时错误:

[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)
它回来了

Request(POST,<function2>,<function1>,List(),List((X-Authentication,myCode2), (X-Application1234,myCode), (content-type,application/json)),List(<function1>, <function1>, <function1>),DIRECT)
Request(POST,,,List(),List((X-Authentication,myCode2),(X-Application1234,myCode),(内容类型,应用程序/json)),List(,),DIRECT)
我做错了什么?有没有其他简单的方法发送https请求?即使涉及到
spray
框架,也没关系(不过我在
spray
中找不到任何关于如何做到这一点的例子)

更新


这里举了一个例子

您需要在当前读取超时的同时指定一个连接超时:
.option(HttpOptions.connTimeout(10000)).option(HttpOptions.readTimeout(50000))
。将
10000
更改为适合您的值。默认的连接超时是非常激进的
100

您确实已经指定了读取超时,但异常表示它在建立连接时超时,而不是在读取响应时超时


请参阅文档:

看起来您的第二个请求没有执行任何实际请求——它只是构造了请求对象,然后由
asString
触发。您确定可以在指定的超时时间内完成请求吗(例如,您是否尝试过对curl执行相同的操作)。@om nom nom我可以注释掉超时时间,但不会更改任何内容。@om nom nom查看我的更新。我也可以用Python来做这个请求,它会很好地工作。它没有帮助。即使我增加60000 10倍,它似乎对它视而不见——根本没有区别,这意味着它的存在与错误一样快。也许我混淆了参数的顺序?奇怪。检查一下:您同时指定了一个
HttpOptions.readTimeout
和一个
HttpOptions.connTimeout
?我不认为订单会有什么不同。下面是我如何使用这两种方法的一个示例:。它现在似乎可以工作了,但返回的结果是空的。但它确实返回了它。
Request(POST,<function2>,<function1>,List(),List((X-Authentication,myCode2), (X-Application1234,myCode), (content-type,application/json)),List(<function1>, <function1>, <function1>),DIRECT)