Obiekt wysyłający różnego rodzaju zapytania JSON

0

Witam.
Mam aplikajce na Androida która wysyła zapytania do serwera RESTfulowego który zwraca odpowiedzi. Zapytań jest aktualnie 10 (UserCreate, UserDelete, UserEdit itp.) i stale rośnie, do tego 10 odpowiedzi. Zapytania realizuje libką Retrofit. Mój problem polega na tym że musze tworzyć osobny obiekt wysyłający zapytania odbierający odpowedzi dla każdego typu zapytania. Czyli 10 obiektów, to strasznie nie wygodne przy edycji. Czy da sie zrobić jeden obiekt który obsługiwał by wszystkie zapytania ?
Oto przykład takiego obiektu dla zapytania UserLogout

import retrofit.Callback;
import retrofit.RestAdapter;
import retrofit.RetrofitError;
import retrofit.client.OkClient;
import retrofit.client.Response;

/**
 * Created by Stanisław on 2015-07-09.
 */
public class LogoutInteractor implements Callback <UserLogoutResponse> {

    private OnLogoutInteractorFinishedListener listener;
    private UserLogoutRequest request;


    public LogoutInteractor(OnLogoutInteractorFinishedListener listener, UserLogoutRequest request){
        this.listener = listener;
        this.request = request;
        sendLogoutRequest();

    }


    private RestAdapter initRestAdapter() {
        OkClient client = new OkClient();
        RestAdapter restAdapter = new RestAdapter.Builder()
                .setClient(client)
                .setEndpoint("http://176.122.224.22:9999")
                .setLogLevel(RestAdapter.LogLevel.FULL)
                .build();

        return restAdapter;
    }
    public void sendLogoutRequest(){
        RestAdapter adapter = initRestAdapter();
        adapter.create(RequestInterface.class).send(request, this);

/* Ta metoda jest zdefiniowana w osobnym interface, tutaj tylko pokazuje jak wygląda
*         @POST("/user/UserLogout") 
*         void send(@Body UserLogoutRequest request, Callback<UserLogoutResponse> callback);
*/
    }

    @Override
    public void success(UserLogoutResponse userLogoutResponse, Response response) {
        listener.onNetworkSuccess(userLogoutResponse, response);
    }


    @Override
    public void failure(RetrofitError error) {
        listener.onNetworkFailure(error);
    }
}

Ja to teraz robiłem tak że przekopiowywałem całą klase i tworzyłem nową zmieniając tylko UserLogoutResponse na np. UserCreateResponse. Wszytskie zapytania są wysyłane POSTem, Działa jak należy ale mało wygodne na dłuższą mete.

0

Czyli masz 10 różnych interfejsów, które implementujesz za każdym razem? Czemu nie możesz zrobić tylko jednego wspólnego?

0

Hmm a może coś w ten deseń

public class RestClient {

    interface UserService {
        @POST("/user/UserLogout")
        Observable<UserLogoutResponse> logoutUser(@Body UserLogoutRequest request);

        Observable<UserCreateResponse> createUser(@Body UserCreateRequest request);

        // itd.. //
    }

    private RestAdapter adapter;

    private UserService userservice;

    public RestClient() {
        userService = new RestAdapter.Builder()
                .setClient(client)
                .setEndpoint("http://176.122.224.22:9999")
                .setLogLevel(RestAdapter.LogLevel.FULL)
                .build();
                .create(UserService.class);

    }

    public Observable<UserLogoutResponse> logoutUser(String... params) {
        UserLogoutRequest request = new UserLogoutRequest(params);
        return userservice.logoutUser(request);
    }


    public Observable<UserCreateResponse> createUser(String... params) {
        UserCreateRequest request = new UserCreateRequest(params);
        return userservice.createUser(request);
    }

    // itd .. //

}
0

Czyli jednym słowem zepsułeś w retroficie to co czyni go wyjątkowym :D Brawo :P

zrób sobie tak:

Stwórz gdzieś interfejs który się będzie nazywał ApiService czy coś w tym stylu np:

public interface ApiService {

    @GET("/users")
    void getUsers(Callback<List<User>> objectCallback);


    @GET("/topics")
    void getTopics(Callback<List<Topic> objectCallback);
}

i tak dalej analogicznie caly CRUD

a później tylko tworzysz Rest adapter jakoś tak:


public ApiService getApiService(){
 RestAdapter restAdapter = builder.setEndpoint(tutajZwrocEndpoint())
                .setConverter(getConverter())
                .setLogLevel(RestAdapter.LogLevel.FULL)
                .build();
        return restAdapter.create(ApiService.class);
}

i cała magia. Wszystkie metody masz w jednym adapterze

i teraz wywołanie żeby nie było:

ApiService apiservice=getApiService();

apiservice.getUsers(new Callback<List<User>>{

  @Override
    public void success(List<User> userList, Response response) {
      
    }
 
 
    @Override
    public void failure(RetrofitError error) {

    }
});

Ot i cała magia :)

tego Twojego nawet boje się analizować co tam narobiłeś :P

0

wojciechmaciejewski twój kod prawie niczym sie nie różni od mojego. I nie rozwiązuje mojego problemu, bo i tak dla każdego requestu musisz robic osobną metode, w twoim przypadku List<User> i List<Topic>. Ja bym chciał jedną metode obsługującą wszystkie requesty.
bolson czy w twoim rozwiązaniu bedę musiał dla każdego wywołania mmetody, nadpisywać success i failure, czy tylko raz dla wszystkich ? Jak bede w domu to przetestuje bo wygląda obiecująco

1 użytkowników online, w tym zalogowanych: 0, gości: 1