我在Android上非常菜鸟。我还用API Rest制作了一个Android应用程序。
我知道我的工作正常,我与 Postman 核对并向其发送要求良好的请求:
@RequestMapping(value = "/login/{email}/{password}", method = RequestMethod.GET, produces = "application/json")
public ResponseEntity<Object> getLogin(HttpServletRequest request,
@PathVariable(value="email") String email,
@PathVariable(value="password") String pass) {
System.out.println("Peticion de login recibida");
Usuario user = usuarioService.login(email, pass);
return new ResponseEntity<Object>(user, HttpStatus.OK);
}
但是现在我正在尝试使用Android Studio配置我的前端。我做了: ApiClient.java
public class ApiClient {
private static final String API_BASE_URL ="http://XXX.XXX.XXX.XXX:8080/";
private static Retrofit retrofit = null;
private static Gson gson;
public static Retrofit getClient() {
if(retrofit == null){
retrofit = new Retrofit.Builder()
.baseUrl(API_BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
}
return retrofit;
}
}
还有InterfaceApi.java我猜这里的问题,但我不确定:
public interface InterfaceAPI {
@FormUrlEncoded
@GET("login/{email}/{password}")
Call<Usuario> login(
@Path("email") String email,
@Path("password") String password
);
}
同样在LoginActivity.java上:
public class LoginActivity extends AppCompatActivity {
InterfaceAPI apiInterface;
private EditText editTextEmail;
private EditText editTextPassword;
private Button btnLogin;
private final String SALUDOS = "Hello from the other side";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
editTextEmail = findViewById(R.id.editTextEmail);
editTextPassword = findViewById(R.id.editTextPassword);
btnLogin = findViewById(R.id.buttonLogin);
btnLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Vamos a acceder a la pagina de inicio si se ha logeuado correctamente
// a traves de este btn y mandamos datos del usuario
userLogin();
}
});
}
private void userLogin() {
apiInterface = ApiClient.getClient().create(InterfaceAPI.class);
String email = editTextEmail.getText().toString().trim();
String password = editTextPassword.getText().toString().trim();
if(checkValidaciones(email, password)){ // these are only checkings and they work
Call<Usuario> call = apiInterface.login(email, password);
call.enqueue(new Callback<Usuario>() {
@Override
public void onResponse(Call<Usuario> call, Response<Usuario> response) {
Usuario res = response.body();
if (res != null){
// vamos a la pagina de Inicial
Intent intent = new Intent(LoginActivity.this, MainActivity.class);
intent.putExtra("saludo", SALUDOS);
//LANZAMOS
startActivity(intent);
Toast.makeText(LoginActivity.this, "Usuario correctamente logueado", Toast.LENGTH_LONG).show();
}else{
//nos quedariamos en la misma pagina de login
Toast.makeText(LoginActivity.this, "Error en login", Toast.LENGTH_LONG).show();
}
}
@Override
public void onFailure(Call<Usuario> call, Throwable t) {
//nos quedamos en la misma pagina de login
Toast.makeText(LoginActivity.this, "Error request", Toast.LENGTH_LONG).show();
}
});
}
}
}
当我按我在de loginActivity上捕获的按钮时,应用程序仅关闭...谁能帮我!预先谢谢你<3
如果将@FromUrlEncoded添加到@GET的顶部,则将具有java.lang.IllegalArgumentException:FormUrlEncoded只能在
带有请求正文的HTTP方法上指定(例如,@ POST)。
尝试从方法中删除@FormUrlEncoded
检查清单中是否具有INTERNET权限在清单中
添加android:usesCleartextTraffic="true"
应用程序标记后尝试
!是的,我删除了它,现在它不会使应用程序崩溃,但是,仍然无法与背面建立连接。
从其他答案中添加该HttpLoggingInterceptor,您将从Logs中获得更多详细信息
是的!就是这样!我想我对android不是很熟悉,我想念那个权限!!ty
这是Android开发中的常见错误。