【问题标题】:how to fix retrofit2 return status 500, not server error?如何修复retrofit2返回状态500,而不是服务器错误?
【发布时间】:2021-09-23 09:46:53
【问题描述】:

从前面的问题可以看出,我现在正在努力改造

从标题可以看出,我确定这不是服务器错误,因为它通常是在post man中执行的。

那么,和上次一样,大概率是我的错,但我很困惑,因为我无法捕捉到这部分的错误。

很抱歉一直发布同样的问题,但我正在尝试再次寻求帮助。真的很抱歉。

我的邮递员

改造API

private val retrofit: Retrofit = Retrofit.Builder()
        .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
        .addConverterFactory(GsonConverterFactory.create())
        .baseUrl(serverIp)
        .build()
val userApi: UserAPI = retrofit.create(UserAPI::class.java)

userapi(控制器)

@POST("user")
    fun loginBody(
        @Body loginRequest : JSONObject
    ) : Single<UserResponse>

用户实现

override fun loginBody(body: JSONObject): Single<UserResponse> {
        return RetrofitAPI.getInstance().userApi.loginBody(body)
    }

我的viewModel(调用改造api)

fun loginEvent(userId: String?, userName: String?, password: String?, phone: String?, gender: String?, age: Int?,
                   email: String?, provider: String?, pushNotiFl:String?, kakaoNotiFl: String?, deviceToken: String?) {

        val jsonObject: JSONObject = JSONObject()
        jsonObject.put("userId", userId)
        jsonObject.put("userName", userName ?: JSONObject.NULL)
        jsonObject.put("password", password ?: JSONObject.NULL)
        jsonObject.put("phone", phone ?: JSONObject.NULL)
        jsonObject.put("age", age ?: JSONObject.NULL)
        jsonObject.put("email", email ?: JSONObject.NULL)
        jsonObject.put("provider", provider ?: JSONObject.NULL)
        jsonObject.put("pushNotiFl", pushNotiFl ?: JSONObject.NULL)
        jsonObject.put("kakaoNotiFl", kakaoNotiFl ?: JSONObject.NULL)
        jsonObject.put("deviceToken", deviceToken ?: JSONObject.NULL)

        addDisposable(
            model.loginBody(jsonObject)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe({
                    _loginResult.postValue(it)
                }, {
                    Timber.d("response error, message : ${it.localizedMessage}")
                })

        )

    }

我的登录活动

viewModel.loginResult.observe(this@LoginActivity, Observer {
                if (it.status == 200){
                    Timber.d("Test Checked ${it.responseData.login.age}")
                }else{
                    Timber.d("Test Checked error ${it.status} ")
                }
            })

logcat中JsonObject参数值

{"userId":"1801298504","userName":null,"password":null,"phone":null,"age":24,"email":null,"provider":null,"pushNotiFl":null,"kakaoNotiFl":null,"deviceToken":null}

我在 logcat 中的错误

loginEvent: response error, message : HTTP 500 

我google了很多关于这个问题,我认为可能是服务器问题,因为错误代码,但邮递员似乎工作正常,所以我认为我发送的数据是问题。

请理解代码是脏的。我花了很多时间思考这个问题,经过了几次测试,所以我没有考虑可读性来加快速度。

【问题讨论】:

  • 我认为你需要摆脱JSONObject。这不是来自 Gson,这是您在 Retrofit 中用于序列化的 (GsonConverterFactory)。创建一个 data class 来模拟您希望发送的有效负载并在您的 Retrofit 调用中使用它。除此之外,添加 OkHttp 日志拦截器、Flipper 或其他一些解决方案,这样您就可以准确地看到您发送到服务器的内容。
  • commonsWare / stackoverflow.com/questions/68356733/… 我得回到我之前的问题,所以我会给你链接。如果你有时间,我会很感激你的帮助。

标签: android kotlin retrofit rx-java2


【解决方案1】:

我认为您需要调试手机的流量。 该问题可能与您忘记在请求中添加某些字段或标头有关。我的意思是您从应用程序和通过邮递员发送的请求的正文/标头之间存在一些细微差别。

您可以通过 Fiddler/Charles 捕获流量,并查看您从应用程序和邮递员发送的原始请求之间的区别。

【讨论】:

【解决方案2】:

确定您写的是正确的服务器地址吗? 同样在“用户”端点之前,您需要添加“/”,因此请确保您做对了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-17
    • 2017-12-13
    • 1970-01-01
    • 1970-01-01
    • 2020-09-12
    相关资源
    最近更新 更多