java - ejemplo - Retrofit 2.0 throwing "IllegalArgumentException: @Field parameters solo se puede usar con codificación de formulario". ¿Cómo hacer una consulta API correcta y corregirla?
retrofit implementation java (4)
Su solicitud no está codificada correctamente, pero es cartero, así que cambie eso:
@FormUrlEncoded
@PUT("/api/register")
Call<AuthRegisterUserModel> getStatus(
@Field("username") String username,
@Field("email") String email,
@Field("password") String password,
@Field("fbID") String fbID,
@Field("gmailID") String gmailID,
@Field("twitID") String twitID,
@Field("gender") String gender,
@Field("birthDate") String birthDate,
@Field("location") String location,
@Field("longitude") String longitude,
@Field("latitude") String latitude,
@Field("profileImage") String profileImage);
Dime si está bien.
Mi problema es que no sé cómo comenzar a usar Retrofit 2.0 con la API recibida , que se menciona a continuación ...
En primer lugar, necesito nombre de usuario, contraseña, fbID (opcional), gmailID (opcional), twitID (opcional), sexo, fecha de nacimiento, ubicación (no es obligatorio, si es largo y lat tiene valores), longitud (opcional), latitud (opcional) , profileImage (opcional).
Cuando todos los parámetros son buenos, recibe el status = true
. Si no, el status = false
recepción status = false
y los parámetros necesarios son incorrectos (p. Ej., El correo ya se ha enviado)
De modo que puedo recibir status = true
o status = false
y array con un máximo de 5 parámetros (nombre de usuario, correo electrónico, contraseña, sexo, fecha de nacimiento).
Intenté esta API Interface
:
public interface AuthRegisterUserApi {
@PUT()
Call<AuthRegisterUserModel> getStatus(
@Field("username") String username,
@Field("email") String email,
@Field("password") String password,
@Field("fbID") String fbID,
@Field("gmailID") String gmailID,
@Field("twitID") String twitID,
@Field("gender") String gender,
@Field("birthDate") String birthDate,
@Field("location") String location,
@Field("longitude") String longitude,
@Field("latitude") String latitude,
@Field("profileImage") String profileImage
);
class Factory {
private static AuthRegisterUserApi service;
public static AuthRegisterUserApi getInstance() {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(ApiConstants.REGISTER_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
service = retrofit.create(AuthRegisterUserApi.class);
return service;
}
}
}
con estos modelos API (Pastebin.com)
y este código en la Activity
:
AuthRegisterUserApi.Factory.getInstance()
.getStatus(
usernameEditText.getText().toString(),
emailEditText.getText().toString(),
passwordEditText.getText().toString(),
"", "", "",
(maleRadioButton.isChecked() ? "male" : "female"),
mYear + "-" + mMonth+1 + "-" + mDay,
(geoLocationToggleButton.isChecked() ? geoLocationEditText.getText().toString() : ""),
(!geoLocationToggleButton.isChecked() ? "50" : ""),
(!geoLocationToggleButton.isChecked() ? "50" : ""),
"")
.enqueue(new Callback<AuthRegisterUserModel>() {
@Override
public void onResponse(Call<AuthRegisterUserModel> call, Response<AuthRegisterUserModel> response) {
if(response.isSuccessful()) {
if (response.body().isStatus()) {
showToast(getApplicationContext(), "Registration ok.");
} else {
response.body().getInfo().getUsername();
}
}
}
@Override
public void onFailure(Call<AuthRegisterUserModel> call, Throwable t) {
}
});
Tengo un error: java.lang.IllegalArgumentException: @Field parameters can only be used with form encoding. (parameter #1) for method AuthRegisterUserApi.getStatus
java.lang.IllegalArgumentException: @Field parameters can only be used with form encoding. (parameter #1) for method AuthRegisterUserApi.getStatus
Intenté registrar al usuario usando Postman y funciona cuando utilicé la opción Body
-> x-www-form-urlencoded
.
¿Cómo puedo crear register
consulta de register
en esta API? ¿Cambiar @Field
a algo más? Tengo este error siempre ...
EDITAR: Necesita cambiar la API Interface
a esto :
public interface AuthRegisterUserApi {
@FormUrlEncoded
@PUT("/api/register")
Call<AuthRegisterUserModel> getStatus(
@Field("username") String username,
@Field("email") String email,
@Field("password") String password,
@Field("fbID") String fbID,
@Field("gmailID") String gmailID,
@Field("twitID") String twitID,
@Field("gender") String gender,
@Field("birthDate") String birthDate,
@Field("location") String location,
@Field("longitude") String longitude,
@Field("latitude") String latitude,
@Field("profileImage") String profileImage
);
class Factory {
private static AuthRegisterUserApi service;
public static AuthRegisterUserApi getInstance() {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(ApiConstants.BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
service = retrofit.create(AuthRegisterUserApi.class);
return service;
}
}
}
BASE_URL = http://ip_address:8400
para mí ...
Pero aún recibí el error: Response.rawResponse = Response{protocol=http/1.1, code=400, message=Bad Request, url=http://ip_address:8400/api/register}
. Usando Postman con los mismos datos que recibí código = 201 Creado. No sé por qué ...
El problema fue porque trato de PUT
por ejemplo, longitude
/ latitude
/ location
sin valor - String
vacía.
Es decir, había un problema en el lado de la API. Para evitar eso, cambié el método a este:
@FormUrlEncoded
@PUT(ApiConstants.REGISTER_URL_PART)
Call<RegisterModel> registerUser(
@Field("username") String username,
@Field("email") String email,
@Field("password") String password,
@Field("fbID") String fbID,
@Field("gmailID") String gmailID,
@Field("twitID") String twitID,
@Field("gender") String gender,
@Field("birthDate") String birthDate,
@Nullable @Field("location") String location,
@Nullable @Field("longitude") String longitude,
@Nullable @Field("latitude") String latitude,
@Field("profileImage") String profileImage
);
Ahora, cuando no valoro ninguno de ellos, simplemente no encierre este campo.
Recibí un mensaje de error similar y noté que en la definición de mi interfaz perdí la anotación @ForUrlEncoded, además de la llamada restante que usará la parte del formulario, que parece ser la misma cosa que usted hizo en el primer bloque de código publicado. Mira esto.
Espero que esto ayude.
simplemente te perdiste @FormUrlEncoded
encima de tu llamada al método Rest.