[英]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)
...
}
这是我尝试发布任务时得到的错误。
基本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.