2016-04-14 23 views
2

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 gibi

User 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' 
} 
+0

Güçlendirme günlüğü ne diyor? Orada da var mı? {"User": {"email": "[email protected]", "password": "myPassword"}} '? – Exaqt

+0

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

+0

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 –

cevap

0

Sonunda sunucuya neler olduğunu tespit ettik. Hata aslında başka bir yerde oluyordu ama burada bildirdiğim noktada atılıyordu.

Hazırlama ve ürün sunucularımız için https kullanıyoruz, ancak yerel sunucum için böyle bir durum söz konusu değil. Bu nedenle, URL'yi kurulum ve üretim sunucuları için güvenli HTTP'yi içerecek şekilde ayarlamadım. dinlenme rotasını doğru bulmak.

Bu hatayı alıyorum, bunun yerine rota bulunamadığı için günlüğe kaydedilmişti.

İlgili konular