我正在尝试发出一个请求,其中包含一个Header,一个form-urlencoded字段和一个json正文。 我的Retrofit界面如下
@FormUrlEncoded
@POST("/api/register")
Observable<RegisterResponse> register(
@Header("Authorization") String authorization,
@Field("grant_type") String grantType,
@Body RegisterBody body
);
当我发出此请求时,我收到异常@Body
参数不能与表单或多部分编码一起使用。
我也试过了@Multipart
注释:
@Multipart
@FormUrlEncoded
@POST("/api/register")
Observable<RegisterResponse> register(
@Header("Authorization") String authorization,
@Part("grant_type") TypedString grantType,
@Body RegisterBody body
);
我得到一个IllegalArgumentException
,只允许一个编码注释。
答案 0 :(得分:62)
也许这可以帮助一些人,如果遇到这个问题,你应该删除界面的@FormUrlEncoded 。 希望这会有所帮助。
答案 1 :(得分:13)
这篇文章向我指出了正确的方向https://stackoverflow.com/a/21423093/1446856。
我将所有内容都附在身体上,然后将其作为TypedInput
发送
所以界面看起来像这样
@POST("/api/register")
@Headers({ "Content-Type: application/json;charset=UTF-8"})
Observable<RegisterResponse> register(
@Header("Authorization") String authorization,
@Body TypedInput body
);
身体看起来像这样
String bodyString = jsonBody + "?grant_type=" +
grantType + "&scope=" + scope;
TypedInput requestBody = new TypedByteArray(
"application/json", bodyString.getBytes(Charset.forName("UTF-8")));
答案 2 :(得分:1)
我通过将字段添加到
来解决了这个问题@POST("/api/register")
像这样:
@POST("/api/register?grantType=value")
它不是一个好的解决方案,但可能有用。
答案 3 :(得分:0)
将带有json正文的身份验证标头发送到Kotlin中的API示例代码:
@POST("/api/user/sendlist/")
fun callSendJsonListPost(
@Header("Authheader") header: String,
@Body list: StringBuilder
)
: Observable<EntityModelUserslist>
答案 4 :(得分:0)
添加到Julien的答案中,还要删除@Multipart
批注。这是我的用法:
@POST("/app/oauth/token")
Call<AuthResponse> getAuthToken(@Body RequestBody body);
而且,这是我构造RequestBody
的方式:
RequestBody requestBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("grant_type", "password")
.addFormDataPart("username", username)
.addFormDataPart("password", password)
.build();