2016-06-23 1 views
16

Моя проблема заключается в том, что я не знаю, как начать использовать Дооснащение 2.0 с полученной API - нижеперечисленным ...Retrofit 2.0 throwing "IllegalArgumentException: параметры @Field могут использоваться только с кодировкой формы". Как сделать правильный запрос API и исправить его?

Во-первых, мне нужно имя пользователя, пароль, fbID (опционально), gmailID (опционально) , twitID (необязательно), пол, дата рождения, место (не обязательно - если long и lat имеют значения), долгота (необязательно), широта (необязательно), profileImage (необязательно).

Когда все параметры являются хорошими - принимайте status = true. Если нет - получить status = false и необходимые параметры, которые являются неправильными (например, почта уже занята)

Так что я могу получить status = true или status = false и массив с макс 5 параметров (имя пользователя, адрес электронной почты, пароль, пол, дата рождения) ,

Я попытался это 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; 
     } 
    } 
} 

with this API models (Pastebin.com)

и этот код в 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) { 

    } 
}); 

У меня есть ошибка: java.lang.IllegalArgumentException: @Field parameters can only be used with form encoding. (parameter #1) for method AuthRegisterUserApi.getStatus

Я пытался зарегистрировать пользователя, используя сообщение человек, и он работает, когда я использовал опцию Body ->x-www-form-urlencoded.

Как я могу создать запрос I register к этому API?@Field Что-то еще? У меня эта ошибка всегда ...

EDIT: Необходимо изменить API Interface к этому:

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 для меня ...

Но все-таки получил ошибку: Response.rawResponse = Response{protocol=http/1.1, code=400, message=Bad Request, url=http://ip_address:8400/api/register}. Используя Postman с теми же данными, я получил код = 201 Created. Не знаю, почему ...

+0

Попробуйте изменить '@ Field' на' @ Query' –

+0

@RaphaelTeyssandier 'IllegalArgumentException: Отсутствует либо URL @PUT, либо параметр @Url. для метода AuthRegisterUserApi.getStatus' и моего 'REGISTER_URL = BASE_URL +" register/";' – y07k2

+0

Могу ли я увидеть все URL? И вы можете попытаться сохранить '@ Field' и добавить выше' @ PUT', '@ FormUrlEncoded' –

ответ

4

Проблема была в том, что я стараюсь PUT, например. longitude \ latitude \ location без значения - String.

Я имею в виду - возникла проблема со стороны API. Таким образом, чтобы избежать этого, я изменил способ это:

@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 
); 

Теперь, когда я иду никакого значения для одного из них, я просто не заключите это поле.

21

Ваш запрос не закодирован правильно, но почтальоном, так что изменить, что:

@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); 

Скажите мне, если это нормально.

+0

'Response.rawResponse = Response {protocol = http/1.1, code = 400, message = Bad Request, url = http: // ip_address: 8400/api/register} '. Co это не работает. – y07k2

+0

Вы уверены, что ваш запрос - это вопрос, а не сообщение? –

+0

Да, я уверен. И, к сожалению, до сих пор нет решения ... – y07k2

1

У меня есть аналогичное сообщение об ошибке, и я заметил, что в своем определении интерфейса я пропустил аннотацию @ForUrlEncoded - поверх остального вызова, который будет использовать часть формы, которая, похоже, та же самая, что вы делали при первом размещенный блок кода. Взгляните на это.

Надеюсь, это поможет.

+0

Ты спас меня, мужчина !!! Спасибо ton. Ошибка, я удалил эту строку и столкнулся с этой ошибкой. – ArhatBaid

2

вы просто пропустили @FormUrlEncoded над вашим вызовом метода «Отдых».

Смежные вопросы