Bu hatayı, dinleyici api'mden (Rails) gelen bir giriş rotasına erişirken, ancak sadece belirli bir adres için gerçekleşirken oluyor.Hata "Beklenen BEGIN_OBJECT ancak STRING oldu" Yalnızca uzak sunucularda gerçekleşiyor
İşte, Android Uygulamamı test etmek için kullanabileceğim 3 farklı adresim var. Biri benim yerel makinemdir, dinlenme sunucumu test etme ve dev amaçları için yerel olarak başlatıyorum ve yapı modelim olarak yerel makineme işaret eden dev'i seçiyorum.
Her şey giriş yolu için iyi çalışır. İşte (ı Sonradan montaj kullanıyorum) benim rotanın bir örneği verilmiştir: Ayrıca
@POST("api/sessions")
Call<User> login(@Body JsonElement user);
, burada her ihtimale karşı, benim güçlendirme dinlenme müdürü:
public static RestService getService(){
OkHttpClient okClient = new OkHttpClient();
okClient.interceptors().add(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Response response = chain.proceed(chain.request());
return response;
}
});
Retrofit client = new Retrofit.Builder()
.baseUrl(URL) //the URL comes from my BuildConfig
.addConverterFactory(GsonConverterFactory.create())
.build();
return client.create(RestService.class);
}
public static RestService getServiceWithHeaders(Context context){
applicationContext = context;
Response result = null;
HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(HttpLoggingInterceptor.Level.BODY);
session = new UserSessionManager(applicationContext);
final User u = session.getUser();
OkHttpClient okClient = new OkHttpClient();
okClient.interceptors().add(logging);
okClient.interceptors().add(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
if (u.email != null) {
Request original = chain.request();
Request newRequest = original.newBuilder()
.header("X-User-Email", u.email)
.header("X-User-Token", u.authentication_token)
.method(original.method(), original.body())
.build();
return chain.proceed(newRequest);
} else {
Response response = chain.proceed(chain.request());
return response;
}
}
});
Retrofit client = new Retrofit.Builder()
.baseUrl(URL)
.addConverterFactory(GsonConverterFactory.create())
.client(okClient)
.build();
return client.create(RestService.class);
}
Ve LoginActivity de
, burada ben onu aramak nasıl : my güzergahtan istendiği gibiUser u = new User();
u.email = String.valueOf(edit_text_email.getText());
u.password = String.valueOf(edit_text_password.getText());
RestService service = RestManager.getService();
JsonElement jsonUser = u.toJson(); //my user
Call<User> call = service.login(jsonUser);
call.enqueue(new Callback<User>() {
@Override
public void onResponse(Response<User> response, Retrofit retrofit) {
if (response.isSuccess()) {
User user = response.body();
user.password = u.password;
user.save();
} else {
//some treatment routines
}
}
@Override
Public void onFailure(Throwable t) {
Log.e(TAG, "doLoginRoutines Failure: " + t.getMessage().toString());
}
});
Yani, giriş güçlendirme yöntemini çağırmadan önce, ben bir JsonElement benim Kullanıcı nesnesini dönüştürmek.
: İşte bunun çıkışı var { "kullanıcı": { "e-posta": "[email protected]", "Parola": "parolam"}}
Daha önce dediğim gibi benim yerel sunucudan o rutin erişirken, her şey yolunda çalışır, ancak ben her iki şekilde benim deneme sunucusundan ya da benim üretim sunucusu seçerseniz, bana bu mesajı döndürür: 1. satır sütun 1 STRING
"Beklenen BEGIN_OBJECT ama oldu yol $ "
Şimdi, tüm üç sunucum eşleşiyor, çünkü bu diğer 2 sunucuda (evreleme ve üretim) çalışan tek kişi benim, bu açıdan diğer 2 sunucudan gelen tek bir rutin yok.
Şimdi, Kullanıcı JsonElement'im ile ilgili bir sorun olduğuna işaret ediyor. Görünüşe göre, bir Nesne olmalı ama bir dizgenin geçtiği. Mesele şu ki (anladığım kadarıyla), JsonElement'im bir Nesne ve tamamen rotayı geçerek o rotayı takip etmeyi denedim.
Kayboldum!
BTW, burada durumda yardımcı olduğunu, benim kütüphanelerini var:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.squareup.retrofit:retrofit:2.0.0-beta2'
compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2'
compile 'com.squareup.retrofit2:adapter-rxjava:2.0.1'
compile 'com.squareup.okhttp:logging-interceptor:2.6.0'
compile 'com.squareup.picasso:picasso:2.3.4'
compile 'com.squareup.okhttp:okhttp:2.4.0'
compile 'com.squareup.okhttp:okhttp-urlconnection:2.2.0'
compile 'com.android.support:support-v4:20.0.0'
compile 'com.android.support:appcompat-v7:20.0.+'
compile 'com.michaelpardo:activeandroid:3.1.0-SNAPSHOT'
compile 'io.reactivex:rxjava:1.1.2'
compile 'io.reactivex:rxandroid:1.1.0'
compile 'org.greenrobot:eventbus:3.0.0'
}
Güçlendirme günlüğü ne diyor? Orada da var mı? {"User": {"email": "[email protected]", "password": "myPassword"}} '? – Exaqt
Bende doğru olmayan bazı şeyleri bekliyorum ** User.class **, Ayrıca yerel sunucu yanıtınızı ikiye katlayın ve evreleme sunucusunun yanıtı aynıdır. – Kathi
Retrofit Buider() çağrısına setLogLevel (LogLevel.FULL) ekleyin ve istek ve yanıtı kontrol edin. Belki bir sorunla karşılaşırsınız –