【问题标题】:Android Code=400 "Bad Request" on POST attemptPOST 尝试时的 Android 代码 = 400“错误请求”
【发布时间】:2020-10-04 11:56:43
【问题描述】:

我的 POST 方法遇到了一些问题,error=400 是“错误请求”。

我尽可能地简化了我的代码以使其正常工作,但仍然出现 400。我错过了什么吗?是我这边还是服务器的问题?

代码:

FormApiInterface.kt

interface FormApiInterface {
    @POST("/forms/filledForm")
    fun sendTrashForm(@Body filledForm: TempFilledForm): Call<TempFilledForm>
}

MenuActivity.kt

class MenuActivity : AppCompatActivity() {
    private lateinit var apiInterface : FormApiInterface

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(activity_main)

        val apiClient = OkHttpClient().newBuilder().build()

        val retrofit = Retrofit.Builder()
            .baseUrl(URL_POST)
            .client(apiClient)
            .addConverterFactory(GsonConverterFactory.create())
            .build();

        apiInterface = retrofit.create(FormApiInterface::class.java)
    }

    fun sendTrash() {
        val tempFilledForm = TempFilledForm(
            userLogin = "filledForm?.userLogin",
            formId = "filledForm?.userLogin",
            formVersion = "filledForm?.formVersion",
            formStatus = "filledForm?.formStatus",
            form = "filledForm?.formFieldsData")

        val call: Call<TempFilledForm> = apiInterface.sendTrashForm(tempFilledForm)

        call.enqueue(object : Callback<TempFilledForm> {
            override fun onFailure(call: Call<TempFilledForm>?, t: Throwable?) {
                Log.v("retrofit", "call failed")
            }

            override fun onResponse(call: Call<TempFilledForm>?, response: Response<TempFilledForm>?) {
                Log.v("retrofit", response.toString())
            }
        })
    }

我在我的 Activity 的一些 onClick 中调用 sendTrash() 并且响应类似于

V/retrofit: Response{protocol=http/1.1, code=400, message=, url=http:--------(covered it)}

“类似”问题都没有帮助。在此先感谢您的帮助

【问题讨论】:

  • 你是否添加了拦截器,它将记录从 api 响应收到的详细错误日志

标签: android kotlin post retrofit retrofit2


【解决方案1】:

正如@Shahriyar Aghajani 指出的那样。尝试从您的服务中删除“/”。

interface FormApiInterface {
    @POST("forms/filledForm")
    fun sendTrashForm(@Body filledForm: TempFilledForm): Call<ResponseObject>
}

此外,您的服务器是否发回与响应相同的对象?

理想情况下,响应会与您输入的正文对象不同!

@Body filledForm: TempFilledForm

以及来自后端Call&lt;ResponseObject&gt;的响应对象

如果您在 build.gradle 中配置了端点,请确保您的端点以“/”结尾

buildTypes {

  debug {
    buildConfigField "String", "BASE_URL", '"http://191.111.3.170:8000/sample/"'
  }

}

【讨论】:

  • 它确实是不同的响应对象。我不小心把我的身体对象放在那里,并没有注意到它。感谢您指出这一点
【解决方案2】:

从终点的开头删除“/”:

interface FormApiInterface {
    @POST("forms/filledForm")
    fun sendTrashForm(@Body filledForm: TempFilledForm): Call<TempFilledForm>
}

并将“/”添加到您的基本网址的末尾

【讨论】:

  • @Alky 检查你的响应模型,它和你的发送体一模一样吗? (TempFilledForm)
【解决方案3】:

您可以尝试通过在 onResponse 方法中添加一些日志来找出“错误请求”的原因:

Log.d("TEST", " errorBody: ${response.errorBody()?.string()}") 

也许你发送了错误的参数。

如果您尝试使用其他模型初始化tempFilledForm 变量,请使用$ 运算符进行字符串插值,并使用花括号进行表达式:

val tempFilledForm = TempFilledForm(
        userLogin = "${filledForm?.userLogin}",
        formId = "${filledForm?.userLogin}",
        formVersion = "${filledForm?.formVersion}",
        formStatus = "${filledForm?.formStatus}",
        form = "${filledForm?.formFieldsData}")

【讨论】:

    猜你喜欢
    • 2020-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-28
    相关资源
    最近更新 更多