RXJava Retrofit возвращает ошибку HTTP POST 500 - PullRequest
0 голосов
/ 01 ноября 2019

Я получаю ОШИБКУ ВНУТРЕННЕГО СЕРВЕРА HTTP 500 на POST, используя RXJAVA и RETROFIT, и я не до конца понимаю, как работает этот Call, но другой Call работает нормально, с той же константой BASE_URL.

Здесьмой интерфейс:

public interface AuthApi {

    @GET("user/{id}")  //users/id
    Flowable<User> getUser(
            @Path("id") int id
    );

    @POST("login")
    @FormUrlEncoded
    Flowable<User> login(
            @Field("username") String username,
            @Field("password") String password
    );
}

Метод @GET работает нормально Метод @POST возвращает ошибку

Я считаю, что это как-то связано с тем, как структурируется строковый или пост-запрос,потому что Почтальон прекрасно работает со следующим json:

{
    "username": "Test1",
    "password": "test1"
}

Вот вызов rxjava:

authApi.login("Test1","test1")
                .toObservable()
                .subscribeOn(Schedulers.io())
                .subscribe(new Observer<User>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                    }

                    @Override
                    public void onNext(User user) {
                        Log.d(TAG,"onNext :"+ user.getEmail());
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.e(TAG, "onError: ", e);
                    }

                    @Override
                    public void onComplete() {

                    }
                });

Возвращает ОШИБКУ ВНУТРЕННЕГО СЕРВЕРА HTTP 500

Норебята, более подробно, вот журнал ошибок:

E/AuthViewModel: onError: 
    retrofit2.adapter.rxjava2.HttpException: HTTP 500 INTERNAL SERVER ERROR
        at retrofit2.adapter.rxjava2.BodyObservable$BodyObserver.onNext(BodyObservable.java:54)
        at retrofit2.adapter.rxjava2.BodyObservable$BodyObserver.onNext(BodyObservable.java:37)
        at retrofit2.adapter.rxjava2.CallExecuteObservable.subscribeActual(CallExecuteObservable.java:47)
        at io.reactivex.Observable.subscribe(Observable.java:10838)
        at retrofit2.adapter.rxjava2.BodyObservable.subscribeActual(BodyObservable.java:34)
        at io.reactivex.Observable.subscribe(Observable.java:10838)
        at io.reactivex.internal.operators.flowable.FlowableFromObservable.subscribeActual(FlowableFromObservable.java:29)
        at io.reactivex.Flowable.subscribe(Flowable.java:12978)
        at io.reactivex.internal.operators.flowable.FlowableOnBackpressureLatest.subscribeActual(FlowableOnBackpressureLatest.java:32)
        at io.reactivex.Flowable.subscribe(Flowable.java:12978)
        at io.reactivex.Flowable.subscribe(Flowable.java:12924)
        at io.reactivex.internal.operators.observable.ObservableFromPublisher.subscribeActual(ObservableFromPublisher.java:31)
        at io.reactivex.Observable.subscribe(Observable.java:10838)
        at io.reactivex.internal.operators.observable.ObservableSubscribeOn$SubscribeTask.run(ObservableSubscribeOn.java:96)
        at io.reactivex.Scheduler$DisposeTask.run(Scheduler.java:452)
        at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:61)
        at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:52)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:764)

Это ожидаемый ответ:

{
    "email": "test1m@test1.ie",
    "id": 11,
    "username": "Test1"
}

Я что-то пропускаю? у вас есть какие-нибудь советы для меня? И есть ли способ отладить запрос POSt, чтобы увидеть запрос POSt?

1 Ответ

1 голос
/ 01 ноября 2019

Отметьте ответ . Вот как вы можете проверить сетевой запрос и ответы для вашего приложения. Также, если вы отправляете POST-запрос с @FormUrlEncoded, эта опция должна быть включена на стороне сервера для правильной обработки. Вы можете попробовать с @Body вместо @FormUrlEncoded и @Field.

@POST("login")
Flowable<User> login(
     @Body LoginData data
);

Где UserInfo - это класс.


public class LoginData {

    private String username;
    private String password;

    public LoginData(String username, String password) {
        this.username = username;
        this.password = password;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

}

...