Android problem z wysyłaniem RESt JSON

0

Mam problem z wołaniem RESTa (wygląda na błąd z parsowaniem).

Exception (leci na lini z wywołaniem metody post()):

Failed resolution of: Ljavax/xml/bind/annotation/XmlRootElement;

java.lang.ClassNotFoundException: Didn't find class "javax.xml.bind.annotation.XmlRootElement" on path: DexPathList[[zip file "/data/app/com.app-2/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]

KOD:

public void registerUser(User user) {
        new AsyncTask<User,Void,Void>() {
            public Void doInBackground(User... params) {
                ClientResponse response = null;
                try {
                    WebResource webQuery = RestClient.service.path("user/registerUser");
                    webQuery.type(MediaType.APPLICATION_JSON);
                    response = webQuery.post(ClientResponse.class, params[0]);
                    System.out.print("dziala");
                } catch (Exception ex) {
                    ex.printStackTrace();
                }

                return null;
            }
        }.execute(user);
    }

KLASA USER:

public class User {
    private String nick;
    private String password;
    private String email;
    private Boolean permament = Boolean.valueOf(false);

    public User() {
    }

getters...
setters...
}

Kombinuje, szukam i nic... ;/

0

nie masz problemu z Multidex i/lub Proguard? jakie masz biblitoeki zaimportowane w gradle?

0
dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.3.1'
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    compile 'com.android.support:design:25.3.1'
    compile 'com.enjoy:Commons:1.0.0-SNAPSHOT'
    compile 'com.android.support:support-v13:25.3.1'
    compile 'com.facebook.android:facebook-android-sdk:[4,5)'
    compile 'com.google.android.gms:play-services-auth:9.8.0'
    compile 'com.sun.jersey:jersey-client:1.9.1'
    compile group: 'com.google.code.gson', name: 'gson', version: '2.8.2'
    testCompile 'junit:junit:4.12'
}

Próbowałem też:

public void registerUser(User user) {
        new AsyncTask<User,Void,Void>() {
            public Void doInBackground(User... params) {
                ClientResponse response = null;
                try {
                    WebResource webQuery = RestClient.service.path("user/registerUser");
                    webQuery.type(MediaType.APPLICATION_JSON).header("Content-Type","application/json");
                    response = webQuery.entity(params[0]).post();
                    System.out.print("dziala");
                } catch (Exception ex) {
                    ex.printStackTrace();
                }

                return null;
            }
        }.execute(user);
    }

Przy takim kodzie dostaje zwrotke z serwera :

returned a response status of 415 Unsupported Media Type
1

https://mvnrepository.com/artifact/com.sun.jersey/jersey-client/1.9.1

widze ze uzywasz biblioteki z 2011 roku, development tego klienta zakonczyl sie w 2015 roku.
uzyj czegos nowego np. Retrofit + OkHttp. bardzo popularne rozwiazanie

0

Można przy pomocy tych bibliotek podpiąć po https z plikiem bks ? Może wrzucę jeszcze kod inicjalizacji clienta.

 public static void init(Context context) {
        SSLContext ctx = null;
        try {
            KeyStore trustStore = KeyStore.getInstance("BKS");
            trustStore.load(context.getResources().openRawResource(R.raw.nowywwww), //plik keystore.bks
                    "159357258456".toCharArray());
            TrustManagerFactory tmf = TrustManagerFactory
                    .getInstance(TrustManagerFactory.getDefaultAlgorithm());
            tmf.init(trustStore);
            ctx = SSLContext.getInstance("SSL");
            ctx.init(null, tmf.getTrustManagers(), null);
        } catch (Exception e) {
            e.printStackTrace();
        }

        ClientConfig config = new DefaultClientConfig();
        config.getProperties().put(HTTPSProperties.PROPERTY_HTTPS_PROPERTIES,
                new HTTPSProperties(null, ctx));

        service = Client.create(config).resource(
                "https://" + "192.168.1.3" + ":"
                        + SharedDataKeeper.SERVERPORT +"/");
        service.setProperty("Content-Type", "application/json");
        service.setProperty("Accept", "application/json");

        javax.net.ssl.HttpsURLConnection.setDefaultHostnameVerifier(
                new javax.net.ssl.HostnameVerifier() {
                    public boolean verify(String hostname,
                                          javax.net.ssl.SSLSession sslSession) {
                        return hostname.equals(SharedDataKeeper.SERVERIPADDRESS);
                    }
                });
    }
0

ok dobra jednak jest nowsza wersja tego Jersay:
https://mvnrepository.com/artifact/com.sun.jersey/jersey-client/1.19.4

podbij u siebie w projekcie, zaktualizuj kod i zobacz czy dziala, zawsze staraj sie pracowac na ostatnich wersjach bibliotek (czasem specjalnie uzywa sie starszych...)

ale polecam zapoznac sie z alternatywa ktora podalem czyli Retrofit OkHttp

0

jeszcze taki news dla Ciebie, widze ze byly mocne problemy z ta biblioteka:

https://blogs.oracle.com/japod/jersey-2x-client-on-android
https://blogs.oracle.com/japod/jersey-2x-client-on-android-take-2

ostatnia stabilna wersja ktora "powinno" sie dac uzyc to 2.26 https://jersey.github.io/ ale nie mialem z tym stycznosci.
jest jakis powod dlaczego ta biblioteka i to w wersji z 2011 roku? jeszcze raz namawiam do Retrofit'a ktory zostal stworzony z mysla o Androidzie

0

Retrofit + RxJava, to jest sluszny wybór

0

jw. moge dodac jeszcze ze Retrofit2 oraz RxJava2
zapoznaj sie tez z Daggerem ;)

0

Zrobiłem sobie na próbe klienta przy pomocy biblioteki Retrofit i OkHttp. Ale mam ciągle błąd:

Hostname 192.168.1.2 not verified:
    certificate: sha256/********************************=
    DN: CN=BLA,OU=BLA,O=BLA,L=BLA,ST=BLA,C=PL,1.2.840.113549.1.9.1=#********************************
    subjectAltNames: []

Kod:

public void retfit() {
        new AsyncTask<User, Void, Void>() {
            public Void doInBackground(User... params) {
                OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder();
                try {
                    SSLContext ctx = null;
                    try {
                        KeyStore trustStore = KeyStore.getInstance("BKS");
                        trustStore.load(context.getResources().openRawResource(R.raw.nowywwww), //plik keystore.bks
                                "159357258456".toCharArray());
                        TrustManagerFactory tmf = TrustManagerFactory
                                .getInstance(TrustManagerFactory.getDefaultAlgorithm());
                        tmf.init(trustStore);
                        ctx = SSLContext.getInstance("SSL");
                        ctx.init(null, tmf.getTrustManagers(), null);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }

                    ClientConfig config = new DefaultClientConfig();
                    config.getProperties().put(HTTPSProperties.PROPERTY_HTTPS_PROPERTIES,
                            new HTTPSProperties(null, ctx));

                    clientBuilder.sslSocketFactory(ctx.getSocketFactory());

                    javax.net.ssl.HttpsURLConnection.setDefaultHostnameVerifier(
                            new javax.net.ssl.HostnameVerifier() {
                                public boolean verify(String hostname,
                                                      javax.net.ssl.SSLSession sslSession) {
                                    return hostname.equals("192.168.1.2");
                                }
                            });
                } catch (Exception e) {
                    e.printStackTrace();
                }

                Retrofit restAdapter = new Retrofit.Builder()
                        .baseUrl("https://" + "192.168.1.2" + ":" + SharedDataKeeper.SERVERPORT + "/")
                        .client(clientBuilder.build())
                        .addConverterFactory(GsonConverterFactory.create())
                        .build();

                UserEdpointInterface userEdpointInterface = restAdapter.create(UserEdpointInterface.class);
                User user = new User();
                user.setEmail("[email protected]");
                user.setNick("dsds");
                user.setPassword("dupa");
                try {
                    Call a = userEdpointInterface.createUser(user);
                    a.enqueue(new Callback() {
                        @Override
                        public void onResponse(Call call, retrofit2.Response response) {
                            System.out.print("dupa");
                        }

                        @Override
                        public void onFailure(Call call, Throwable t) {
                            System.out.print("dupa2");
                        }
                    });
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return null;
            }

        }.execute();
    }

Interfejst:

public interface UserEdpointInterface {
    @POST("user/registerUser")
    Call<User> createUser(@Body User user);
}

Kombinuje od kilku godzin i nic...

0

Ogolnie za malo dajesz info, serwer ma certyfikat?

zobacz:

this.client.setHostnameVerifier(new HostnameVerifier() {
    @Override
    public boolean verify(String hostname, SSLSession session) {
        //TODO: Make this more restrictive
        return true;
    }
});

https://github.com/square/okhttp/issues/1467

0
Pendzoncy jelen napisał(a):

Ogolnie za malo dajesz info, serwer ma certyfikat?

zobacz:

this.client.setHostnameVerifier(new HostnameVerifier() {
    @Override
    public boolean verify(String hostname, SSLSession session) {
        //TODO: Make this more restrictive
        return true;
    }
});

https://github.com/square/okhttp/issues/1467

Tak ma certyfikat, twoja podpowiedź pomogła częściowo :P Pojawił się nowy problem, w metodzie onResponse dostaje komunikat:

Response{protocol=http/1.1, code=500, message=Request failed., url=https://192.168.1.3:6036/user/registerUser}

Dodałem do interfacu adnotacje @Header:

public interface UserEdpointInterface {
    @Headers("Content-Type: application/json")
    @POST("user/registerUser")
    Call<User> createUser(@Body User user);
}

Połączenie z serwerem jest na pewno .

Po stornie serwera:

@Path("/user")
public class UserManagerRest {
	
	@POST
	@Path("registerUser")
	@Consumes(MediaType.APPLICATION_JSON)
	public Response registerUser(User user) {
....
}

}
0

to że połączenie jest to ja widze. masz error code=500
https://en.wikipedia.org/wiki/List_of_HTTP_status_codes
czyli serwer error. szukaj exception wywalane przez serwer teraz ;)

0
Zakręcony Ogrodnik napisał(a):

to że połączenie jest to ja widze. masz error code=500
https://en.wikipedia.org/wiki/List_of_HTTP_status_codes
czyli serwer error. szukaj exception wywalane przez serwer teraz ;)

Po stronie serwera zero błędów :P

0
darksead napisał(a):

Zrobiłem sobie na próbe klienta przy pomocy biblioteki Retrofit i OkHttp. Ale mam ciągle błąd:

Hostname 192.168.1.2 not verified:
    certificate: sha256/********************************=
    DN: CN=BLA,OU=BLA,O=BLA,L=BLA,ST=BLA,C=PL,1.2.840.113549.1.9.1=#********************************
    subjectAltNames: []

Kod:

public void retfit() {
        new AsyncTask<User, Void, Void>() {
            public Void doInBackground(User... params) {
                OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder();
                try {
                    SSLContext ctx = null;
                    try {
                        KeyStore trustStore = KeyStore.getInstance("BKS");
                        trustStore.load(context.getResources().openRawResource(R.raw.nowywwww), //plik keystore.bks
                                "159357258456".toCharArray());
                        TrustManagerFactory tmf = TrustManagerFactory
                                .getInstance(TrustManagerFactory.getDefaultAlgorithm());
                        tmf.init(trustStore);
                        ctx = SSLContext.getInstance("SSL");
                        ctx.init(null, tmf.getTrustManagers(), null);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }

                    ClientConfig config = new DefaultClientConfig();
                    config.getProperties().put(HTTPSProperties.PROPERTY_HTTPS_PROPERTIES,
                            new HTTPSProperties(null, ctx));

                    clientBuilder.sslSocketFactory(ctx.getSocketFactory());

                    javax.net.ssl.HttpsURLConnection.setDefaultHostnameVerifier(
                            new javax.net.ssl.HostnameVerifier() {
                                public boolean verify(String hostname,
                                                      javax.net.ssl.SSLSession sslSession) {
                                    return hostname.equals("192.168.1.2");
                                }
                            });
                } catch (Exception e) {
                    e.printStackTrace();
                }

                Retrofit restAdapter = new Retrofit.Builder()
                        .baseUrl("https://" + "192.168.1.2" + ":" + SharedDataKeeper.SERVERPORT + "/")
                        .client(clientBuilder.build())
                        .addConverterFactory(GsonConverterFactory.create())
                        .build();

                UserEdpointInterface userEdpointInterface = restAdapter.create(UserEdpointInterface.class);
                User user = new User();
                user.setEmail("[email protected]");
                user.setNick("dsds");
                user.setPassword("dupa");
                try {
                    Call a = userEdpointInterface.createUser(user);
                    a.enqueue(new Callback() {
                        @Override
                        public void onResponse(Call call, retrofit2.Response response) {
                            System.out.print("dupa");
                        }

                        @Override
                        public void onFailure(Call call, Throwable t) {
                            System.out.print("dupa2");
                        }
                    });
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return null;
            }

        }.execute();
    }

Interfejst:

public interface UserEdpointInterface {
    @POST("user/registerUser")
    Call<User> createUser(@Body User user);
}

Kombinuje od kilku godzin i nic...

Po co ci ten AsyncTask i OkHttp? Najpierw spróbuj bez ssl i przede wszystkim poczytaj jak to się powinno robić. Tu np ładnie opisane: https://www.learn2crack.com/2016/11/android-rxjava-2-and-retrofit.html

Rxjava2 + Retrofit2

0

To jest tylko próba, a nie już gotowe rozwiązanie. Bez certyfikatu działa mi na starym sposobie (ten co pisałem wcześniej)

A Async używam z przyzwyczajenia bo poprzednie moje rozwiązanie tego wymaga (ograniczenie androidowe że każde zapytanie http musi iść asynchronicznie)

0

Retrofit działa asynchronicznie i nie potrzebujesz żadnego AsyncTask. W ogóle zresztą nadużywanie AsyncTask wskazuje zawsze na początkującego.

0
Biały Lew napisał(a):

Retrofit działa asynchronicznie i nie potrzebujesz żadnego AsyncTask. W ogóle zresztą nadużywanie AsyncTask wskazuje zawsze na początkującego.

Co do androida to faktycznie jestem początkującym tylko co to ma do tego? W ogóle używałem go bo poprzedniego sposobu kontaktowania się z restem nie wykonasz inaczej a w drugim nie wiedziałem że ta biblioteka robi to już asynchronicznie...

0

Można synchronicznie albo asynchronicznie. Wszystko jest w dokumentacji

0

mniejsza o asynchronicznosc teraz, mam nadal problem z wołaniem tego resta :(

Przy moim pierwszym sposobie wszystko działa ale gdy już próbuje wołać resta gdzie muszę wrzucić jakiś obiekt jako parameter to się sypie.

0

Jak się w końcu okazało wszystko działa jak powinno przy pomocy Retrofit + OkHttp według implementacji którą wrzuciłem kilka postów wyżej. Odrzucenia z serwera były powodowane tym że po stronie serwera były dodatkowe sprawdzenia poprawności przesłanych danych a wysyłałem je nieprawidłowe (np długość jakiegoś stringa itp).

0

Wywal ten AsyncTask, bo equeue jest i tak już asynchroniczne.

0

spoko, zapoznaj sie tez z Dagger'em do DI

ogolnie to:
https://github.com/bayandin/awesome-awesomeness
sekcja Android :)

0

Async dawno wywalony. Takie szybkie pytanie bo nigdzie nie mogę znaleźć konkretniej odpowiedzi. Czy OkHttp i Retrofit można używać w aplikacjach komercyjnych?

0

mozna, poczytaj o licencjach

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