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'
}
Was sagt die Nachrüstung? Hast du da auch '{" user ": {" email ":" [email protected] "," passwort ":" myPassword "}}'? – Exaqt
erwarte etwas nicht korrekt in dir ** User.class **, auch doppelte konforme Ihre lokalen Server-Antwort und Staging-Server Antwort sind gleich. – Kathi
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 –