I'm trying to send the following java model as form encoded body WITHOUT the wrapping {}
. I've tried everything I can find to send a Model NOT as JSON but as form encoded data using Retrofit 2.
// Sends as JSON
@Headers("Content-Type:application/x-www-form-urlencoded")
@POST(SERVICES + USERS)
Observable<UserInfoResponse> signupUser(@Body SignUpParams params);
// Works
@FormUrlEncoded
@POST(SERVICES + USERS)
Observable<UserInfoResponse> signupUser(
@Field("approve") boolean approve,
@Field("daily_newsletter") int newsletter,
@Field("include_order_info") boolean includeOrderInfo,
@Field("is_21") int is21,
@Field("is_guest") int isGuest,
@Field("method") String method,
@Field("email") String email,
@Field("password") String password,
@Field("oauth_token") String oauthToken
);
Here's our setup if it helps
// Dagger Provider
@Provides
@Singleton
@Named(JT_API)
Retrofit provideJTSecureApiRetrofit(OkHttpClient okHttpClient, Gson gson) {
Retrofit retrofit = new Retrofit.Builder().client(okHttpClient)
.baseUrl(jtBaseUrl)
.addConverterFactory(GsonConverterFactory.create(gson))
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
return retrofit;
}
@Provides
@Singleton
OkHttpClient provideOkHttpClient(JTApp app) {
Interceptor addUrlParams = chain -> {
Request request = chain.request();
HttpUrl url = request.url()
.newBuilder()
.addQueryParameter("app_version", BuildConfig.VERSION_NAME)
.build();
request = request.newBuilder()
.url(url)
.build();
return chain.proceed(request);
};
OkHttpClient.Builder okHttpClientBuilder = new OkHttpClient.Builder();
okHttpClientBuilder.addInterceptor(addUrlParams);
// this doesn't seem to do anything…
okHttpClientBuilder.addInterceptor(chain -> {
Request original = chain.request();
Request.Builder requestBuilder = original.newBuilder()
.addHeader("Content-Type", "application/x-www-form-urlencoded");
Request request = requestBuilder.build();
return chain.proceed(request);
});
okHttpClientBuilder.readTimeout(JTApp.HTTP_TIMEOUT, TimeUnit.SECONDS)
.connectTimeout(JTApp.HTTP_TIMEOUT, TimeUnit.SECONDS);
return okHttpClientBuilder.build();
}