2015-09-30 7 views
9

Sto inviando una richiesta, ma sto ottenendo un'eccezione, anche se la richiesta ha esito positivo (l'API con cui sto interagendo, invia un OTP in caso di successo).Come ottenere JSON non valido in Retrofit 2

L'eccezione è:

com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 2 path $ 
      at com.google.gson.stream.JsonReader.syntaxError(JsonReader.java:1573) 
      at com.google.gson.stream.JsonReader.checkLenient(JsonReader.java:1423) 
      at com.google.gson.stream.JsonReader.doPeek(JsonReader.java:575) 
      at com.google.gson.stream.JsonReader.peek(JsonReader.java:429) 
      at com.google.gson.internal.bind.TypeAdapters$13.read(TypeAdapters.java:349) 
      at com.google.gson.internal.bind.TypeAdapters$13.read(TypeAdapters.java:346) 
      at com.google.gson.TypeAdapter.fromJson(TypeAdapter.java:256) 
      at retrofit.GsonConverter.fromBody(GsonConverter.java:42) 
      at retrofit.OkHttpCall.parseResponse(OkHttpCall.java:144) 
      at retrofit.OkHttpCall.access$000(OkHttpCall.java:25) 
      at retrofit.OkHttpCall$1.onResponse(OkHttpCall.java:90) 
      at com.squareup.okhttp.Call$AsyncCall.execute(Call.java:168) 
      at com.squareup.okhttp.internal.NamedRunnable.run(NamedRunnable.java:33) 
      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) 
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 
      at java.lang.Thread.run(Thread.java:856) 

Ora come vorrei vedere che JSON deforme? Per sapere se l'oggetto JSON è malformato, se è l'oggetto che viene restituito (che mi aspetto essere una stringa), o è l'oggetto che sto inviando.

Perdonami se questa è una domanda banale, ho iniziato solo con lo sviluppo Android, a partire da questa settimana.

Qui è il servizio:

public static EnrollmentApiInterface getApiClient(){ 
    if (EnrollmentRequest == null) { 
     OkHttpClient client = new OkHttpClient(); 
     client.interceptors().add(new Interceptor() { 
      @Override 
      public Response intercept(Chain chain) throws IOException { 
       Response response = chain.proceed(chain.request()); 

       Request request = chain.request(); 
       Buffer buffer = new Buffer(); 
       request.body().writeTo(buffer); 
       String body = buffer.readUtf8(); 
       Log.println(10, TAG, body); 
       Log.i(TAG, "hello:  " + response); 

       String bodyString = response.body().string(); 
       Log.i(TAG, bodyString); 
       response = response.newBuilder() 
        .body(ResponseBody.create(response.body().contentType(), bodyString)) 
        .build(); 
       return response; 
      } 
     }); 

     Gson gson = new GsonBuilder() 
      .setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ") 
      .create(); 

     Retrofit retrofit = new Retrofit.Builder() 
      // .baseUrl("http://10.0.2.2:6543/") // On AVD 
      .baseUrl("http://192.168.0.106:6543") // On device 
      .addConverterFactory(GsonConverterFactory.create(gson)) 
      .build(); 

     EnrollmentRequest = retrofit.create(EnrollmentApiInterface.class); 
    } 
    return EnrollmentRequest; 
} 

Interfaccia:

public interface EnrollmentApiInterface { 

     @Headers({ 
      "Accept: application/json", 
      "Content-Type: application/json" 
     }) 
     @POST("auth/enroll") 
     Call<String> RequestEnrollment(@Body JsonObject EnrollmentDetails); 

     @Headers({ 
      "Accept: application/json", 
      "Content-Type: application/json" 
     }) 
     @POST("auth/enroll/auth") 
     Call<String> AuthoriseEnrollment(@Body JsonObject LoginDetails); 


    } 
} 

e qui è la chiamata:

EnrollmentRequest request = new EnrollmentRequest(); 
    request.setMsisdn(MsisdnTxt.getText().toString()); 
    request.setId_number(IdNumberTxt.getText().toString()); 
    EnrollmentApiClient.EnrollmentApiInterface service = EnrollmentApiClient.getApiClient(); 
    Log.i(TAG, "REQUEST: " + request.toJson()); 
    Call<String> call = service.RequestEnrollment(request.toJson()); 
    call.enqueue(new Callback<String>() { 
     @Override 
     public void onResponse(Response<String> response) { 
      Log.i(TAG, "ON RESPONSE" + response); 
      Log.i(TAG, "ON RESPONSE BODY" + response.body()); 
      // Create object of SharedPreferences. 
      SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(that); 
      //now get Editor 
      SharedPreferences.Editor editor = sharedPref.edit(); 
      //put your value 
      editor.putString("IDnumber", IdNumberTxt.getText().toString()); 
      editor.putString("Msisdn", MsisdnTxt.getText().toString()); 

      //commits your edits 
      editor.commit(); 
      Log.i(TAG, "onClick-AFTER"); 
      Intent intent = new Intent(getApplicationContext(), AuthoriseActivity.class); 
      startActivity(intent); 

     } 

     @Override 
     public void onFailure(Throwable t) { 
      // It always comes in here 
      Log.i(TAG, "NOTHERE", t); 
      Log.d("CallBack", " Throwable is " + t.toString()); 

      Toast.makeText(EnrollActivity.this, "Request Failed", Toast.LENGTH_LONG).show(); 
     } 

    }); 
+0

Ciao retrofit beta-2 ha rilasciato che ha parametro retrofit insieme con la risposta che vi aiuterà visualizzare i dati grezzi come risposta. Il tuo problema è la risposta inviata dal server non è in formato valido. È possibile creare il proprio gsonConverter, passare l'adattatore e all'interno è possibile vedere la risposta dal server che lo converte come stringa. – subhash

+0

@subhash Ho aggiunto un convertitore di stringhe, perché mi aspetto che la risposta sia una stringa, ma ottengo lo stesso errore. qualche idea? – Renier

risposta

7

Basta accedere le tue risposte di rete, in modo da vedere che cosa c'è che non va .

@Override 
public Response intercept(Chain chain) throws IOException { 
    Response response = chain.proceed(chain.request()); 
    Log.w("[email protected]", response.body().string()); 
    return response; 
} 
+1

Dove lo metterei? al momento è nel mio metodo 'getApiClient', ma non sta registrando nulla (ho il sospetto che potrebbe non chiamarlo). Devo chiamarlo? se è così dove? – Renier

+4

Devi impostare il tuo 'OkHttpClient' in' Retrofit.Builder' usando il metodo 'client'. – dtx12

+0

Grazie per il tuo aiuto! :) – Renier

0

convertitore Usa stringa di corredare restadapter

RestAdapter adapterRfqPost = new RestAdapter.Builder() 
        .setEndpoint(Constants.ENDPOINT) 
        .setConverter(new ConstantsMethods.StringConverter()) 
        .build(); 

classe String convertitore

public static class StringConverter implements Converter { 
     @Override 
     public Object fromBody(TypedInput typedInput, Type type) throws ConversionException { 
      String text = null; 
      try { 
       text = fromStream(typedInput.in()); 
      } catch (IOException ignored) {/*NOP*/ } 
      return text; 
     } 

     @Override 
     public TypedOutput toBody(Object o) { 
      return null; 
     } 



public static String fromStream(InputStream in) throws IOException { 
     BufferedReader reader = new BufferedReader(new InputStreamReader(in)); 
     StringBuilder out = new StringBuilder(); 
     String newLine = System.getProperty("line.separator"); 
     String line; 
     while ((line = reader.readLine()) != null) { 
      out.append(line); 
      out.append(newLine);`enter code here` 
      }`enter code here` 
      return out.toString(); 
     } 
    }