harsh_v
harsh_v

Reputation: 3269

retrofit.HttpException: HTTP 400 Bad Request android (closed)

I am trying to implement a basic user registration. I am using RxJava and retrofit (v2 beta).

URL: http://momento-w03d.c9users.io/register
Fields
username
password
fullname
email

When I use postman to send these 4 fields as form-data response is : ["success"]

Is there something I am doing wrong or it is because I am using cloud9 server.

I am new to retrofit, and I am not able to understand where am I making the mistake. Thanks a lot for your time.

Class AuthServiceFactory

public class AuthServiceFactory {
    private static Retrofit.Builder builder = new Retrofit.Builder()
                    .baseUrl(AuthService.BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .addCallAdapterFactory(RxJavaCallAdapterFactory.create());


    public static <S> S createService(Class<S> clazz) {
        final Retrofit retrofit = builder.build();
        S service = retrofit.create(clazz);
        return service;
    }
}

Interface AuthService

public interface AuthService {
    String BASE_URL = "http://momento-w03d.c9users.io";

    @FormUrlEncoded
    @POST("/register")
    Observable<Message> register(@Field("username") String username,
                                 @Field("password") String password,
                                 @Field("email") String email,
                                 @Field("fullname") String fullname);
}

Model class Message

public class Message {
    private String message;

    public String getMessage() {
        return message;
    }
}

Method body that sends request

AuthService authService = AuthServiceFactory.createService(AuthService.class);
authService.register("lorem", "12345678", "[email protected]", "lorem imposium")
                        .subscribeOn(Schedulers.newThread())
                        .observeOn(AndroidSchedulers.mainThread())
                        .subscribe(new Subscriber<Message>() {
    @Override
    public void onCompleted() {

    }

    @Override
    public void onError(Throwable e) {
        e.printStackTrace();
    }

    @Override
    public void onNext(Message message) {
        System.out.println(message.getMessage());
    }
});

StackTrace

W/System.err: retrofit.HttpException: HTTP 400 Bad Request
W/System.err:     at retrofit.RxJavaCallAdapterFactory$SimpleCallAdapter$1.call(RxJavaCallAdapterFactory.java:163)
W/System.err:     at retrofit.RxJavaCallAdapterFactory$SimpleCallAdapter$1.call(RxJavaCallAdapterFactory.java:158)
W/System.err:     at rx.internal.operators.OperatorMap$1.onNext(OperatorMap.java:55)
W/System.err:     at retrofit.RxJavaCallAdapterFactory$CallOnSubscribe.call(RxJavaCallAdapterFactory.java:113)
W/System.err:     at retrofit.RxJavaCallAdapterFactory$CallOnSubscribe.call(RxJavaCallAdapterFactory.java:88)
W/System.err:     at rx.Observable$2.call(Observable.java:162)
W/System.err:     at rx.Observable$2.call(Observable.java:154)
W/System.err:     at rx.Observable$2.call(Observable.java:162)
W/System.err:     at rx.Observable$2.call(Observable.java:154)
W/System.err:     at rx.Observable.unsafeSubscribe(Observable.java:7710)
W/System.err:     at rx.internal.operators.OperatorSubscribeOn$1$1.call(OperatorSubscribeOn.java:62)
W/System.err:     at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55)
W/System.err:     at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422)
W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
W/System.err:     at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:152)
W/System.err:     at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:265)
W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
W/System.err:     at java.lang.Thread.run(Thread.java:818)

Upvotes: 1

Views: 12641

Answers (1)

LordRaydenMK
LordRaydenMK

Reputation: 13321

public interface AuthService {
    String BASE_URL = "http://momento-w03d.c9users.io";

    @POST("/register")
    Observable<Message> register(@Body RegisterBody body);
}

public class RegisterBody {
    String username;
    String password;
    String fullname;
    String email;

    public RegisterBody(String username, String password, String fullname, String email) {
        this.username = username;
        this.password = password;
        this.fullname = fullname;
        this.email = email;
    }
}

Upvotes: 1

Related Questions