2017-01-19 29 views
2

我試圖爲我的應用程序創建忘記密碼腳本。當我運行我的apk並嘗試休息我的密碼時出現錯誤使用JsonReader.setLenient(true)接受格式錯誤的JSON在第1行第1列路徑$錯誤,一切工作正常我的apk我可以登錄和註銷或註冊,但當我重置密碼時,我得到了JsonReader.setLenient(true)錯誤。我的apk json正在工作,它是正確的。請幫幫我。我正在分享我的代碼。

{ 
    "operation":"resPassReq", 
    "user":{ 
     "email":"[email protected]" 

    } 
} 

以及如果所述請求是廣告獲得成功的響應將類似於,

{ 
    "result": "success", 
    "message": "Check your mail for reset password code." 
} 

在精加工密碼重置過程的請求將類似於,

{ 
    "operation":"resPass", 
    "user":{ 
     "email":"[email protected]", 
     "code":"bcfqa3", 
     "password":"rjamalw" 

    } 
} 

,並且如果該請求成功的迴應會類似於,

{ 
    "result": "success", 
    "message": "Password Changed Successfully" 
} 

ResetPasswordFragment.java

import retrofit2.Call; 
import retrofit2.Callback; 
import retrofit2.Retrofit; 
import retrofit2.converter.gson.GsonConverterFactory; 

public class ResetPasswordFragment extends Fragment implements View.OnClickListener{ 

    private AppCompatButton btn_reset; 
    private EditText et_email,et_code,et_password; 
    private TextView tv_timer; 
    private ProgressBar progress; 
    private boolean isResetInitiated = false; 
    private String email; 
    private CountDownTimer countDownTimer; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     View view = inflater.inflate(R.layout.fragment_password_reset,container,false); 
     initViews(view); 
     return view; 
    } 

    private void initViews(View view){ 

     btn_reset = (AppCompatButton)view.findViewById(R.id.btn_reset); 
     tv_timer = (TextView)view.findViewById(R.id.timer); 
     et_code = (EditText)view.findViewById(R.id.et_code); 
     et_email = (EditText)view.findViewById(R.id.et_email); 
     et_password = (EditText)view.findViewById(R.id.et_password); 
     et_password.setVisibility(View.GONE); 
     et_code.setVisibility(View.GONE); 
     tv_timer.setVisibility(View.GONE); 
     btn_reset.setOnClickListener(this); 
     progress = (ProgressBar)view.findViewById(R.id.progress); 


    } 

    @Override 
    public void onClick(View v) { 
     switch (v.getId()){ 

      case R.id.btn_reset: 

       if(!isResetInitiated) { 


        email = et_email.getText().toString(); 
        if (!email.isEmpty()) { 
         progress.setVisibility(View.VISIBLE); 
         initiateResetPasswordProcess(email); 
        } else { 

         Snackbar.make(getView(), "Fields are empty !", Snackbar.LENGTH_LONG).show(); 
        } 
       } else { 

        String code = et_code.getText().toString(); 
        String password = et_password.getText().toString(); 

        if(!code.isEmpty() && !password.isEmpty()){ 

         finishResetPasswordProcess(email,code,password); 
        } else { 

         Snackbar.make(getView(), "Fields are empty !", Snackbar.LENGTH_LONG).show(); 
        } 

       } 

       break; 
     } 
    } 

    private void initiateResetPasswordProcess(String email){ 

     Retrofit retrofit = new Retrofit.Builder() 
       .baseUrl(Constants.BASE_URL) 
       .addConverterFactory(GsonConverterFactory.create()) 
       .build(); 

     RequestInterface requestInterface = retrofit.create(RequestInterface.class); 

     User user = new User(); 
     user.setEmail(email); 
     ServerRequest request = new ServerRequest(); 
     request.setOperation(Constants.RESET_PASSWORD_INITIATE); 
     request.setUser(user); 
     Call<ServerResponse> response = requestInterface.operation(request); 

     response.enqueue(new Callback<ServerResponse>() { 
      @Override 
      public void onResponse(Call<ServerResponse> call, retrofit2.Response<ServerResponse> response) { 

       ServerResponse resp = response.body(); 
       Snackbar.make(getView(), resp.getMessage(), Snackbar.LENGTH_LONG).show(); 

       if(resp.getResult().equals(Constants.SUCCESS)){ 

        Snackbar.make(getView(), resp.getMessage(), Snackbar.LENGTH_LONG).show(); 
        et_email.setVisibility(View.GONE); 
        et_code.setVisibility(View.VISIBLE); 
        et_password.setVisibility(View.VISIBLE); 
        tv_timer.setVisibility(View.VISIBLE); 
        btn_reset.setText("Change Password"); 
        isResetInitiated = true; 
        startCountdownTimer(); 

       } else { 

        Snackbar.make(getView(), resp.getMessage(), Snackbar.LENGTH_LONG).show(); 

       } 
       progress.setVisibility(View.INVISIBLE); 
      } 

      @Override 
      public void onFailure(Call<ServerResponse> call, Throwable t) { 

       progress.setVisibility(View.INVISIBLE); 
       Log.d(Constants.TAG,"failed"); 
       Snackbar.make(getView(), t.getLocalizedMessage(), Snackbar.LENGTH_LONG).show(); 
       Log.d(Constants.TAG, t.getLocalizedMessage()); 
      } 
     }); 
    } 

    private void finishResetPasswordProcess(String email,String code, String password){ 

     Retrofit retrofit = new Retrofit.Builder() 
       .baseUrl(Constants.BASE_URL) 
       .addConverterFactory(GsonConverterFactory.create()) 
       .build(); 

     RequestInterface requestInterface = retrofit.create(RequestInterface.class); 

     User user = new User(); 
     user.setEmail(email); 
     user.setCode(code); 
     user.setPassword(password); 
     ServerRequest request = new ServerRequest(); 
     request.setOperation(Constants.RESET_PASSWORD_FINISH); 
     request.setUser(user); 
     Call<ServerResponse> response = requestInterface.operation(request); 

     response.enqueue(new Callback<ServerResponse>() { 
      @Override 
      public void onResponse(Call<ServerResponse> call, retrofit2.Response<ServerResponse> response) { 

       ServerResponse resp = response.body(); 
       Snackbar.make(getView(), resp.getMessage(), Snackbar.LENGTH_LONG).show(); 

       if(resp.getResult().equals(Constants.SUCCESS)){ 

        Snackbar.make(getView(), resp.getMessage(), Snackbar.LENGTH_LONG).show(); 
        countDownTimer.cancel(); 
        isResetInitiated = false; 
        goToLogin(); 

       } else { 

        Snackbar.make(getView(), resp.getMessage(), Snackbar.LENGTH_LONG).show(); 

       } 
       progress.setVisibility(View.INVISIBLE); 
      } 

      @Override 
      public void onFailure(Call<ServerResponse> call, Throwable t) { 

       progress.setVisibility(View.INVISIBLE); 
       Log.d(Constants.TAG,"failed"); 
       Snackbar.make(getView(), t.getLocalizedMessage(), Snackbar.LENGTH_LONG).show(); 

      } 
     }); 
    } 

    private void startCountdownTimer(){ 
     countDownTimer = new CountDownTimer(120000, 1000) { 

      public void onTick(long millisUntilFinished) { 
       tv_timer.setText("Time remaining : " + millisUntilFinished/1000); 
      } 

      public void onFinish() { 
       Snackbar.make(getView(), "Time Out ! Request again to reset password.", Snackbar.LENGTH_LONG).show(); 
       goToLogin(); 
      } 
     }.start(); 
    } 

    private void goToLogin(){ 

     Fragment login = new LoginFragment(); 
     FragmentTransaction ft = getFragmentManager().beginTransaction(); 
     ft.replace(R.id.fragment_frame,login); 
     ft.commit(); 
    } 
} 

RequestInterface.java

public interface RequestInterface { 

    @POST("req/") 
    Call<ServerResponse> operation(@Body ServerRequest request); 

} 

但是當我更改類似下面我的代碼,一切工作正常,但問題是,得到了響應onFailure處

private void initiateResetPasswordProcess(String email){ 
     HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); 
     interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); 
     OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).build(); 
     Retrofit retrofit = new Retrofit.Builder() 
       .baseUrl(Constants.BASE_URL) 
       .client(client) 
       .addConverterFactory(GsonConverterFactory.create()) 
       .build(); 

     RequestInterface requestInterface = retrofit.create(RequestInterface.class); 

     User user = new User(); 
     user.setEmail(email); 
     ServerRequest request = new ServerRequest(); 
     request.setOperation(Constants.RESET_PASSWORD_INITIATE); 
     request.setUser(user); 
     Call<ServerResponse> response = requestInterface.operation(request); 

     response.enqueue(new Callback<ServerResponse>() { 
      @Override 
      public void onResponse(Call<ServerResponse> call, retrofit2.Response<ServerResponse> response) { 

       ServerResponse resp = response.body(); 
       Snackbar.make(getView(), resp.getMessage(), Snackbar.LENGTH_LONG).show(); 

       if(resp.getResult().equals(Constants.SUCCESS)){ 

        Snackbar.make(getView(), resp.getMessage(), Snackbar.LENGTH_LONG).show(); 
        et_email.setVisibility(View.GONE); 
        et_code.setVisibility(View.VISIBLE); 
        et_password.setVisibility(View.VISIBLE); 
        tv_timer.setVisibility(View.VISIBLE); 
        btn_reset.setText("Change Password"); 
        isResetInitiated = true; 
        startCountdownTimer(); 

       } else { 

        Snackbar.make(getView(), resp.getMessage(), Snackbar.LENGTH_LONG).show(); 

       } 
       progress.setVisibility(View.INVISIBLE); 
      } 

      @Override 
      public void onFailure(Call<ServerResponse> call, Throwable t) { 

       progress.setVisibility(View.INVISIBLE); 
       Log.d(Constants.TAG,"failed"); 
       // Snackbar.make(getView(), resp.getMessage(), Snackbar.LENGTH_LONG).show(); 
       et_email.setVisibility(View.GONE); 
       et_code.setVisibility(View.VISIBLE); 
       et_password.setVisibility(View.VISIBLE); 
       tv_timer.setVisibility(View.VISIBLE); 
       btn_reset.setText("Change Password"); 
       isResetInitiated = true; 
       startCountdownTimer(); 
       // Snackbar.make(getView(), t.getLocalizedMessage(), Snackbar.LENGTH_LONG).show(); 


      } 
     }); 
    } 

    private void finishResetPasswordProcess(String email,String code, String password){ 
     HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); 
     interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); 
     OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).build(); 

     Retrofit retrofit = new Retrofit.Builder() 
       .baseUrl(Constants.BASE_URL) 
       .client(client) 
       .addConverterFactory(GsonConverterFactory.create()) 
       .build(); 

     RequestInterface requestInterface = retrofit.create(RequestInterface.class); 

     User user = new User(); 
     user.setEmail(email); 
     user.setCode(code); 
     user.setPassword(password); 
     ServerRequest request = new ServerRequest(); 
     request.setOperation(Constants.RESET_PASSWORD_FINISH); 
     request.setUser(user); 
     Call<ServerResponse> response = requestInterface.operation(request); 

     response.enqueue(new Callback<ServerResponse>() { 
      @Override 
      public void onResponse(Call<ServerResponse> call, retrofit2.Response<ServerResponse> response) { 

       ServerResponse resp = response.body(); 
       Snackbar.make(getView(), resp.getMessage(), Snackbar.LENGTH_LONG).show(); 

       if(resp.getResult().equals(Constants.SUCCESS)){ 

        Snackbar.make(getView(), resp.getMessage(), Snackbar.LENGTH_LONG).show(); 
        countDownTimer.cancel(); 
        isResetInitiated = false; 
        goToLogin(); 

       } else { 

        Snackbar.make(getView(), resp.getMessage(), Snackbar.LENGTH_LONG).show(); 

       } 
       progress.setVisibility(View.INVISIBLE); 
      } 

      @Override 
      public void onFailure(Call<ServerResponse> call, Throwable t) { 

       progress.setVisibility(View.INVISIBLE); 
       Log.d(Constants.TAG,"failed"); 
       // Snackbar.make(getView(), t.getLocalizedMessage(), Snackbar.LENGTH_LONG).show(); 
       countDownTimer.cancel(); 
       isResetInitiated = false; 
       goToLogin(); 

      } 
     }); 
    } 

ServerResponse.java

public class ServerResponse { 

    private String result; 
    private String message; 
    private User user; 

    public String getResult() { 
     return result; 
    } 

    public String getMessage() { 
     return message; 
    } 

    public User getUser() { 
     return user; 
    } 
} 

ServerRequest.java

public class ServerRequest { 

    private String operation; 
    private User user; 

    public void setOperation(String operation) { 
     this.operation = operation; 
    } 

    public void setUser(User user) { 
     this.user = user; 
    } 
} 
+1

歡迎來到Stack Overflow!爲了給你一個很好的答案,如果你有一個[問],如果你還沒有看過,它可能會幫助我們。如果你可以提供[mcve],它可能也很有用。 – Mat

+0

你應該分享你得到的錯誤。你可以用Log.d(Constants.TAG,「failed」,t)替換'''Log.d(Constants.TAG,「failed」);'''可以打印它; onFailure回調。您可能還想輸出「調用」對象包含的任何相關信息。 – Haem

+0

我得到了這個錯誤 - JsonReader.setLenient(true)接受格式不正確的JSON在第1行第1列路徑$錯誤 – Misty

回答

0
private void initiateResetPasswordProcess(String email){ 
      HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); 
      interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); 
      OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).build(); 
      Gson gson = new GsonBuilder() 
          .setLenient() 
          .create(); 
      Retrofit retrofit = new Retrofit.Builder() 
        .baseUrl(Constants.BASE_URL) 
        .client(client) 
        .addConverterFactory(GsonConverterFactory.create(gson)) 
        .build(); 

      RequestInterface requestInterface = retrofit.create(RequestInterface.class); 

      User user = new User(); 
      user.setEmail(email); 
      ServerRequest request = new ServerRequest(); 
      request.setOperation(Constants.RESET_PASSWORD_INITIATE); 
      request.setUser(user); 
      Call<ServerResponse> response = requestInterface.operation(request); 

      response.enqueue(new Callback<ServerResponse>() { 
       @Override 
       public void onResponse(Call<ServerResponse> call, retrofit2.Response<ServerResponse> response) { 

        ServerResponse resp = response.body(); 
        Snackbar.make(getView(), resp.getMessage(), Snackbar.LENGTH_LONG).show(); 

        if(resp.getResult().equals(Constants.SUCCESS)){ 

         Snackbar.make(getView(), resp.getMessage(), Snackbar.LENGTH_LONG).show(); 
         et_email.setVisibility(View.GONE); 
         et_code.setVisibility(View.VISIBLE); 
         et_password.setVisibility(View.VISIBLE); 
         tv_timer.setVisibility(View.VISIBLE); 
         btn_reset.setText("Change Password"); 
         isResetInitiated = true; 
         startCountdownTimer(); 

        } else { 

         Snackbar.make(getView(), resp.getMessage(), Snackbar.LENGTH_LONG).show(); 

        } 
        progress.setVisibility(View.INVISIBLE); 
       } 

       @Override 
       public void onFailure(Call<ServerResponse> call, Throwable t) { 

        progress.setVisibility(View.INVISIBLE); 
        Log.d(Constants.TAG,"failed"); 
        // Snackbar.make(getView(), resp.getMessage(), Snackbar.LENGTH_LONG).show(); 
        et_email.setVisibility(View.GONE); 
        et_code.setVisibility(View.VISIBLE); 
        et_password.setVisibility(View.VISIBLE); 
        tv_timer.setVisibility(View.VISIBLE); 
        btn_reset.setText("Change Password"); 
        isResetInitiated = true; 
        startCountdownTimer(); 
        // Snackbar.make(getView(), t.getLocalizedMessage(), Snackbar.LENGTH_LONG).show(); 


       } 
      }); 
     } 

     private void finishResetPasswordProcess(String email,String code, String password){ 
      HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); 
      interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); 
      OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).build(); 
      Gson gson = new GsonBuilder() 
          .setLenient() 
          .create(); 
      Retrofit retrofit = new Retrofit.Builder() 
        .baseUrl(Constants.BASE_URL) 
        .client(client) 
        .addConverterFactory(GsonConverterFactory.create(gson)) 
        .build(); 

      RequestInterface requestInterface = retrofit.create(RequestInterface.class); 

      User user = new User(); 
      user.setEmail(email); 
      user.setCode(code); 
      user.setPassword(password); 
      ServerRequest request = new ServerRequest(); 
      request.setOperation(Constants.RESET_PASSWORD_FINISH); 
      request.setUser(user); 
      Call<ServerResponse> response = requestInterface.operation(request); 

      response.enqueue(new Callback<ServerResponse>() { 
       @Override 
       public void onResponse(Call<ServerResponse> call, retrofit2.Response<ServerResponse> response) { 

        ServerResponse resp = response.body(); 
        Snackbar.make(getView(), resp.getMessage(), Snackbar.LENGTH_LONG).show(); 

        if(resp.getResult().equals(Constants.SUCCESS)){ 

         Snackbar.make(getView(), resp.getMessage(), Snackbar.LENGTH_LONG).show(); 
         countDownTimer.cancel(); 
         isResetInitiated = false; 
         goToLogin(); 

        } else { 

         Snackbar.make(getView(), resp.getMessage(), Snackbar.LENGTH_LONG).show(); 

        } 
        progress.setVisibility(View.INVISIBLE); 
       } 

       @Override 
       public void onFailure(Call<ServerResponse> call, Throwable t) { 

        progress.setVisibility(View.INVISIBLE); 
        Log.d(Constants.TAG,"failed"); 
        // Snackbar.make(getView(), t.getLocalizedMessage(), Snackbar.LENGTH_LONG).show(); 
        countDownTimer.cancel(); 
        isResetInitiated = false; 
        goToLogin(); 

       } 
      }); 
     } 
+1

編輯後,我得到了另一個錯誤 - > java.lang.IllegalStateException:期望的BEGIN_OBJECT,但是在第1行第1列路徑$ STRING STRING $ – Misty

+0

也在問題中給予ServerResponse類代碼。現在,這是json解析錯誤。 –

+0

我已添加ServResponse類。 – Misty

0

我面臨這個問題,最後,我解決了這個問題。

你必須讓所有$行的API中的同名表的數據庫上,類似這樣的

"book_chalet_id" => $row['book_chalet_id'], 

所以在表必須有列book_chalet_id

相關問題