繁体   English   中英

如何使用Retrofit发送帖子请求?

[英]How can I send a post request with Retrofit?

我正在尝试使用Retrofit发送post请求,但服务器响应错误400:错误请求。

BaseURL: http ://taskdemoserver.pythonanywhere.com

这是服务器文档的屏幕截图。

服务器文档

这是改造界面。

package com.e.databaseapp

import retrofit2.Call
import retrofit2.http.*

interface Service {
    @Headers("user: joan","Content-Type: application/json")
    @GET( "task" )
    fun getListTask() : Call<TaskListContainer>

    @Headers("user: joan","Content-Type: application/json")
    @POST("task")
    fun saveTask (@Body task: Task) : Call<Task>

    @Headers("user: joan")
    @DELETE("task")
    fun deleteTask (task: String) : Call<Void>
}

我在我的存储库中创建了一个Retrofit实例。

lass TaskRepository(val taskDao: TaskDao) {
    val gson : Gson = GsonBuilder()
        .setLenient()
        .create()

    val loggingInterceptor : HttpLoggingInterceptor = HttpLoggingInterceptor()
        .setLevel(HttpLoggingInterceptor.Level.BODY)

    val httpClient : OkHttpClient = OkHttpClient.Builder()
        .addInterceptor(loggingInterceptor)
        .build()

    val retrofit: Retrofit = Retrofit.Builder()
        .baseUrl("http://taskdemoserver.pythonanywhere.com/")
        .addConverterFactory(GsonConverterFactory.create(gson))
        .client(httpClient)
        .build()

    val service: Service = retrofit.create(Service::class.java)

...

}

这是我尝试发布任务时得到的错误。

错误400:错误请求

基本URL应始终以/结尾

更改.baseUrl("http://taskdemoserver.pythonanywhere.com")

val retrofit: Retrofit = Retrofit.Builder()
        .baseUrl("http://taskdemoserver.pythonanywhere.com")
        .addConverterFactory(GsonConverterFactory.create(gson))
        .client(httpClient)
        .build()

.baseUrl("http://taskdemoserver.pythonanywhere.com/")

你可能遇到这些问题:

1)服务器无法定义响应的内容。 尝试添加内容类型的标题: @Headers("Content-Type: application/json")

2)你的基本网址在最后丢失/斜线。

即使我不是100%确定这是否是您的问题,因为您上传的服务器文档不完整,我相信问题是服务器要求您发送要创建的任务的数据使用MIME类型application/x-www-form-urlencoded ,这就是为什么它说formdata在你上传的服务器文档的图片创建任务endopoint的权利。

但是,您正在使用@Body tasks: TaskListContainer ,而是将新任务的信息作为JSON数据application/json (@Body注释)

这就是你在做什么

我使用post application/json作为您请求的Content-Type,使用Postman测试了您的端点。 这就是Retrofit现在正在做的事情,因为您在Retrofit服务中使用了@Body注释。

标题错了 回应错了

这是你应该做的事情

现在,如果我使用Postman发送POST请求但是使用form-data类型,使用带有键task的Field和表示要创建的任务名称的String值,我得到一个成功的响应。

标题是正确的 回应正确

要告诉Retrofit像这样发送POST请求,你必须像这样定义你的saveTask方法:

    interface Service {
    ...

    @Headers("user: joan")
    @FormUrlEncoded
    @POST("task")
    fun saveTask (@Field("task") taskname: String) : Call<Task>

    ...
}

您可以在官方文档中查看有关@FormUrlEncoded注释的更多信息。

此外,作为@YuriPopiv说,你缺少你最后的斜线baseUrl 尝试将其设置为.baseUrl("http://taskdemoserver.pythonanywhere.com/")或者.baseUrl("http://taskdemoserver.pythonanywhere.com/") /开头定义端点。

来自文档

基本URL应始终以/结尾。 尾随/确保作为相对路径的端点值将正确地附加到具有路径组件的基础。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM