저는 새로운 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);
}
}
더 이상 정보를 필요가 있다면 알려 주시기 바랍니다! 시간 내 주셔서 감사합니다!
메소드 'onFailure'에 중단 점을 놓고 오류의 내용을 확인하십시오. –
onFaliure에서 t.getcause() 및 t.getmessage()의 결과는 무엇입니까? –
@AnkurKhandelwal은 모두 "java.lang.illegalStateException : 예상 BEGIN_OBJECT이지만 줄 1 열 4 경로 $에서 NUMBER"이라고 말합니다. – Azotherian