2016-04-14 3 views
2

Ich habe diesen Fehler passiert beim Zugriff auf eine Login-Route von meinem erholsamen api (Rails), aber nur für eine bestimmte Adresse.Fehler "Erwartet BEGIN_OBJECT aber war STRING" passiert nur auf Remote-Servern

Hier ist der Deal, ich habe 3 verschiedene Adressen, die ich verwenden kann, um meine Android-Anwendung zu testen. Einer ist meine lokale Maschine, ich starte meinen Restserver lokal für Test- und Entwicklungszwecke und als meine Build-Variante wähle ich Dev, der auf meinen lokalen Rechner verweist.

Alles läuft gut für die Login-Route. Hier ist ein Beispiel meiner Route (ich verwende Retrofit):

@POST("api/sessions") 
Call<User> login(@Body JsonElement user); 

Auch hier ist mein Retrofit Rest-Manager, nur für den Fall:

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); 
} 

Und an meinem LoginActivity, hier ist, wie ich es nennen :

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()); 


    } 
    }); 

Also, bevor das Login-Retrofit-Methode aufrufen, verwandeln ich mein Benutzerobjekt zu einem JsonElement, wie aus meiner Route angefordert. Hier ist die Ausgabe davon:

{ "user": { "E-Mail": "[email protected]", "Passwort": "myPassword"}}

Wie ich schon sagte, wenn diese Routine von meinem lokalen Server zugreift, läuft alles in Ordnung, aber wenn ich so oder so mein Staging-Server oder meine Produktionsserver wählen, es gibt mir diese Meldung:

„Expected BEGIN_OBJECT aber war STRING in Zeile 1, Spalte 1 Pfad $

Jetzt passen alle meine drei erholsamen Server zusammen, denn ich bin die einzige Person, die an diesen anderen 2 Servern arbeitet (Staging und Produktion), es gibt keine einzige andere Routine, die von diesen anderen 2 Servern kommt.

Jetzt verstehe ich, dass es auf etwas mit meinem Benutzer JsonElement falsch zeigt. Offensichtlich sollte es ein Objekt sein, aber eine Zeichenfolge wurde übergeben. Das Ding ist (so weit ich es verstanden habe), mein JsonElement ist ein Objekt und ich habe versucht, mit dieser Route zu basteln, indem ich eine reine Zeichenfolge übergeben habe, dann ein Objekt ohne Erfolg.

Ich bin verloren!

BTW, hier ist mein Libs, falls das hilft:

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

Was sagt die Nachrüstung? Hast du da auch '{" user ": {" email ":" [email protected] "," passwort ":" myPassword "}}'? – Exaqt

+0

erwarte etwas nicht korrekt in dir ** User.class **, auch doppelte konforme Ihre lokalen Server-Antwort und Staging-Server Antwort sind gleich. – Kathi

+0

Fügen Sie setLogLevel (LogLevel.FULL) zu Ihrem Aufruf von Retrofit.Buider() hinzu und überprüfen Sie die Anforderung und die Antwort. Vielleicht finden Sie ein Problem –

Antwort

0

Ich habe endlich gefunden, was auf dem Server vorging. Der Fehler passierte tatsächlich woanders, aber an dem Punkt, an dem ich hier berichtete, wurde er ausgelöst.

Für meine Staging- und Prod-Server verwenden wir https, aber das ist nicht der Fall für meinen lokalen Server. Da ich die URL nicht ordnungsgemäß eingerichtet hatte, um das sichere HTTP für Staging- und Produktionsserver zu enthalten, war dies okHTTP nicht die restliche Route richtig finden.

Das ist interessant zu beachten, dass der Fehler protokolliert werden sollte, da die Route nicht gefunden wurde statt dieser, die ich bekam.