【问题标题】:POST fails with Retrofit (connect timed out) but works with Postman [closed]POST因改造而失败(连接超时),但与邮递员一起工作[关闭]
【发布时间】:2018-06-30 08:54:23
【问题描述】:

已解决:愚蠢的错误,我有 https://foo.foo.com:433 而不是 https://foo.foo.com:443...

我已经实现了改造,我正在尝试发送一个带有 JSON 数据作为 JsonObject 的 POST 请求。它不工作,我得到一个失败的“连接超时”,但我可以通过邮递员毫无问题地发送一个 POST 请求。起初我以为是因为标题,我尝试过使用拦截器并使用@Header 而不是@Headers。感谢您的帮助。

邮递员

来自 HttpLoggingInterceptor() 的日志

Jun 30, 2018 10:22:09 AM okhttp3.internal.platform.Platform log
INFO: --> POST https://foo.foo.com:433/
Jun 30, 2018 10:22:09 AM okhttp3.internal.platform.Platform log
INFO: Content-Type: application/json
Jun 30, 2018 10:22:09 AM okhttp3.internal.platform.Platform log
INFO: Content-Length: 132
Jun 30, 2018 10:22:09 AM okhttp3.internal.platform.Platform log
INFO: 
Jun 30, 2018 10:22:09 AM okhttp3.internal.platform.Platform log
INFO: {"transport":"web","userId":"ggrojeomieje2","moduleId":105,"moduleName":"signal","moduleVersion":1,"operation":"signal","params":{}}
Jun 30, 2018 10:22:09 AM okhttp3.internal.platform.Platform log
INFO: --> END POST (132-byte body)
Jun 30, 2018 10:22:19 AM okhttp3.internal.platform.Platform log
failure connect timed out [Ljava.lang.StackTraceElement;@3850debc
INFO: <-- HTTP FAILED: java.net.SocketTimeoutException: connect timed out 

API 接口

interface ApiEndpoints {
    @POST("/")
    @Headers("Content-Type: application/json")
    fun sendRequest(@Body json: PostModel): Call<ResponseModel>
} 

改造客户端

class ApiClient {
    val service = Retrofit.Builder()
        .baseUrl("https://foo.foo.com:433")
        .client(client) // Implement HttpLoggingInterceptor()
        .addConverterFactory(GsonConverterFactory.create())
        .build()
        .create(ApiEndpoints::class.java)
}    

API 调用

val test = ApiClient().service.sendRequest(
            PostModel("web",
                    "ggrojeomieje2",
                    105,
                    "signal",
                    1,
                    "signal",
                    Params())
)

test.enqueue(object : Callback<ResponseModel> {
        override fun onResponse(call: Call<ResponseModel>?, response: Response<ResponseModel>?) {
            println("response " + response?.body()?.params?.timestamp.toString())
        }

        override fun onFailure(call: Call<ResponseModel>?, t: Throwable?) {
            println("failure " + t?.message.toString())
        }
    }) 

模型

data class ResponseModel(val params: Params?)


data class PostModel(var transport: String? = null,
                     var userId: String? = null,
                     var moduleId: Int? = 0,
                     var moduleName: String? = null,
                     var moduleVersion: Int? = 0,
                     var operation: String? = null,
                     var params: Params?
)

data class Params(var timestamp: Unit? = null)

回应

{"params":{"timestamp":1.530346984546E9}} 

【问题讨论】:

    标签: android json post kotlin retrofit


    【解决方案1】:

    尝试在OkHttpClient中设置超时值。

    val client = OkHttpClient.Builder()
        .connectTimeout(30, TimeUnit.SECONDS)
        .writeTimeout(30, TimeUnit.SECONDS)
        .readTimeout(30, TimeUnit.SECONDS)
        .build()
    

    还可以尝试更改请求正文类型,例如 x-www-form-urlencodedform-data 以及类似 @Headers({"content-type: application/json"}) 的标头

    检查是否有任何与网络相关的问题,或者只是尝试一些简单的GET 方法也失败了。

    【讨论】:

    • 刚试过,现在我在 onFailure() 中得到这个错误:Failed to connect to foo.foo.com/54.246.216.106:433。谢谢
    • 检查是否有任何与网络相关的问题,或者只是尝试一些简单的 GET 方法也失败了。
    • 愚蠢的错误,我用https://foo.foo.com:433 而不是https://foo.foo.com:443...谢谢您的时间
    • 哦,我也没有注意到。
    【解决方案2】:

    愚蠢的错误,我用https://foo.foo.com:433 而不是https://foo.foo.com:443...

    【讨论】:

      猜你喜欢
      • 2017-07-17
      • 1970-01-01
      • 1970-01-01
      • 2014-09-07
      • 1970-01-01
      • 2011-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多