2017-11-02 1 views
0

저는 새로운 Android 개발자입니다. 내 서버에서 응답을 다시 보내려고하지만 시도 할 때 onFailure 만 치고 있습니다. 나는 튜토리얼을 살펴보고 원하는 방식으로 코드를 변경하려고 시도했다. 내 코드는 내 서버에서 만든 API에 사용자 이름과 암호를 보내고 응답을 받아야합니다.Retrofit2를 사용하여 POST 응답을받을 수 없습니다.

LoginPage.java (MainActivity) :

package com.example.azo.loginapp; 

//Android packages 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.content.Intent; 
import android.text.TextUtils; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 
import android.widget.Toast; 

//Project packages 
import com.example.azo.loginapp.data.model.Post; 
import com.example.azo.loginapp.data.remote.APIService; 
import com.example.azo.loginapp.data.remote.ApiUtils; 

//Retrofit packages 
import org.json.JSONException; 
import org.json.JSONObject; 
import retrofit2.Call; 
import retrofit2.Callback; 
import retrofit2.Response; 

public class LoginPage extends AppCompatActivity{ 
    private EditText Name; 
    private EditText Password; 
    private TextView Info; 
    private Button Login; 
    private int counter = 5; 

    private APIService mAPIService; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.login_page); 
     mAPIService = ApiUtils.getAPIService(); 
     Name = findViewById(R.id.etName); 
     Password = findViewById(R.id.etPass); 
     Info = findViewById(R.id.tvInfo); 
     Login = findViewById(R.id.btnLogin); 

     Info.setText("No of attempts remaining: 5"); 

     Login.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       validate(Name.getText().toString(),Password.getText().toString()); 
      } 
     }); 
    } 

    public void sendPost(String username, String password) { 
     try { 
      JSONObject paramObject = new JSONObject(); 
      paramObject.put("username", username); 
      paramObject.put("password", password); 
      Call<Post> postCall = mAPIService.savePost(paramObject.toString()); 
      postCall.enqueue(new Callback<Post>(){ 
       @Override 
       public void onResponse(Call<Post> call,Response<Post> response) { 
        Toast.makeText(LoginPage.this, "It worked!",Toast.LENGTH_SHORT).show(); 
       } 

       @Override 
       public void onFailure(Call<Post> call, Throwable t) { 
        Toast.makeText(LoginPage.this, "Something went wrong :(", Toast.LENGTH_SHORT).show(); 
       } 
      }); 
     }catch(JSONException e){ 
      e.printStackTrace(); 
     } 
    } 

    private void validate(String userName, String userPass){ 
     if(!TextUtils.isEmpty(userName) && !TextUtils.isEmpty(userPass)){ 
      sendPost(userName, userPass); 
     }else{ 
      counter--; 
      Info.setText("No of atttempts remaining: " + String.valueOf(counter)); 
      if(counter == 0) { 
       Login.setEnabled(false); 
      } 
     } 
    } 
} 

APIService.java :

package com.example.azo.loginapp.data.remote; 
import com.example.azo.loginapp.data.model.Post; 
import retrofit2.Call; 
import retrofit2.http.Body; 
import retrofit2.http.Headers; 
import retrofit2.http.POST; 
/** 
    * Created by azotherian on 11/1/17. 
*/ 

public interface APIService { 
    @Headers("Content-Type: application/json") 
    @POST("login") 
    Call<Post> savePost(@Body String body); 
} 

Post.java :

package com.example.azo.loginapp.data.model; 
/** 
* Created by azotherian on 11/1/17. 
*/ 
import com.google.gson.annotations.Expose; 
import com.google.gson.annotations.SerializedName; 

public class Post { 
    @SerializedName("username") 
    @Expose 
    private String username; 

    @SerializedName("password") 
    @Expose 
    private String password; 

    public String getUsername(){ 
     return username; 
    } 

    public void setUsername(String username){ 
     username = username; 
    } 

    public String getPassword(){ 
     return password; 
    } 

    public void setPassword(String password){ 
     password = password; 
    } 

    @Override 
    public String toString(){ 
     return "Post{" + 
      "username='" + username + '\'' + 
      ", password='" + password + '\'' + 
      '}'; 
    } 
} 

RetrofitClient.java :

여기 내 코드입니다
package com.example.azo.loginapp.data.remote; 

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

/** 
* Created by azotherian on 11/1/17. 
*/ 

public class RetrofitClient { 
    private static Retrofit retrofit = null; 

    public static Retrofit getClient(String baseUrl) { 
     if (retrofit==null) { 
      retrofit = new Retrofit.Builder() 
       .baseUrl(baseUrl) 
       .addConverterFactory(GsonConverterFactory.create()) 
       .build(); 
     } 
     return retrofit; 
    } 
} 

ApiUtils.java :

package com.example.azo.loginapp.data.remote; 

/** 
* Created by azotherian on 11/1/17. 
*/ 

public class ApiUtils { 
    private ApiUtils() {} 

    public static final String BASE_URL = "http://107.170.239.46/"; 

    public static APIService getAPIService() { 
     return RetrofitClient.getClient(BASE_URL).create(APIService.class); 
    } 
} 

더 이상 정보를 필요가 있다면 알려 주시기 바랍니다! 시간 내 주셔서 감사합니다!

+0

메소드 'onFailure'에 중단 점을 놓고 오류의 내용을 확인하십시오. –

+0

onFaliure에서 t.getcause() 및 t.getmessage()의 결과는 무엇입니까? –

+0

@AnkurKhandelwal은 모두 "java.lang.illegalStateException : 예상 BEGIN_OBJECT이지만 줄 1 열 4 경로 $에서 NUMBER"이라고 말합니다. – Azotherian

답변

0

(@AnkurKhandelwal 및 @JuanCruzSoler 덕분에) 일부 연구 및 디버깅을 마친 후 코드를 gson이 디코딩 할 때 본문에서 응답을 기다리고있는 것으로 나타났습니다. 내가 서버에서 몸으로 아무것도 돌려 보내지 않았기 때문에 나는 무효화를 사용하도록 내 전화를 변경해야했다. 이 코드는 LoginPage.java 내부했다 : 나는 <T> 's의 내부 무효 모든 포스트를 변경

Call<Void> voidCall = mAPIService.savePost(paramObject.toString()); 
voidCall.enqueue(new Callback<Void>(){ 
    @Override 
    public void onResponse(Call<Void> call, Response<Void> response) { 
     Toast.makeText(LoginPage.this, "It worked!", Toast.LENGTH_SHORT).show(); 
    } 

    @Override 
    public void onFailure(Call<Void> call, Throwable t) { 
     Toast.makeText(LoginPage.this, "Something went wrong :(", Toast.LENGTH_SHORT).show(); 
     } 
    }); 

. 도와 주셔서 감사합니다!

관련 문제