Модификация получения пустых параметров из вызова POST - PullRequest
1 голос
/ 03 июня 2019

Я использую модификацию для выполнения вызовов API в моем приложении для Android. Все отлично работает с GET-запросами, но когда я вызываю API с помощью метода POST и передаю ему свой собственный объект с аннотацией @Body, API не ' t получает переданные параметры. Я тестировал тот же API с теми же значениями в POSTMAN, и я получил ответ. Я уже некоторое время использую Retrofit, но не понимаю, что именно происходит в этом случае. Любая помощь будет принята.

ApiInterface.java

@POST("User/login")
@Headers("x-api-key: 123456")
Call<LoginResponse> login(@Body LoginRequest loginRequest);

LoginRequest.java

public class LoginRequest {

@SerializedName("email")
@Expose
public String email;
@SerializedName("password")
@Expose
public String password;
@SerializedName("deviceType")
@Expose
public Integer deviceType;
@SerializedName("deviceId")
@Expose
public String deviceId;
@SerializedName("versionName")
@Expose
public String versionName;

public LoginRequest() {
}

public LoginRequest(String email, String password, Integer deviceType, String deviceId, String versionName) {
    super();
    this.email = email;
    this.password = password;
    this.deviceType = deviceType;
    this.deviceId = deviceId;
    this.versionName = versionName;
}
    //getters and setters

}

LoginResponse.java

public class LoginResponse {

@SerializedName("userId")
@Expose
private String userId;
@SerializedName("firstName")
@Expose
private String firstName;
@SerializedName("middleName")
@Expose
private Object middleName;
@SerializedName("lastName")
@Expose
private String lastName;
@SerializedName("email")
@Expose
private String email;
@SerializedName("phone")
@Expose
private String phone;
@SerializedName("userCompany")
@Expose
private String userCompany;
@SerializedName("userName")
@Expose
private String userName;
@SerializedName("userDesignation")
@Expose
private String userDesignation;
@SerializedName("companyName")
@Expose
private String companyName;
@SerializedName("photo")
@Expose
private Object photo;
@SerializedName("userType")
@Expose
private String userType;
@SerializedName("code")
@Expose
private String code;
@SerializedName("countryCode")
@Expose
private String countryCode;
@SerializedName("countryName")
@Expose
private String countryName;
@SerializedName("supervisor")
@Expose
private String supervisor;
@SerializedName("taskStatus")
@Expose
private Integer taskStatus;
@SerializedName("checkInStatus")
@Expose
private Integer checkInStatus;
@SerializedName("time")
@Expose
private String time;
@SerializedName("checkInPlace")
@Expose
private String checkInPlace;
@SerializedName("checkInId")
@Expose
private String checkInId;
@SerializedName("checkinDate")
@Expose
private String checkinDate;
@SerializedName("permission")
@Expose
private List<Permission> permission = null;

public LoginResponse() {
}

public LoginResponse(String userId, String firstName, Object middleName, String lastName, String email, String phone, String userCompany, String userName, String userDesignation, String companyName, Object photo, String userType, String code, String countryCode, String countryName, String supervisor, Integer taskStatus, Integer checkInStatus, String time, String checkInPlace, String checkInId, String checkinDate, List<Permission> permission) {
    super();
    this.userId = userId;
    this.firstName = firstName;
    this.middleName = middleName;
    this.lastName = lastName;
    this.email = email;
    this.phone = phone;
    this.userCompany = userCompany;
    this.userName = userName;
    this.userDesignation = userDesignation;
    this.companyName = companyName;
    this.photo = photo;
    this.userType = userType;
    this.code = code;
    this.countryCode = countryCode;
    this.countryName = countryName;
    this.supervisor = supervisor;
    this.taskStatus = taskStatus;
    this.checkInStatus = checkInStatus;
    this.time = time;
    this.checkInPlace = checkInPlace;
    this.checkInId = checkInId;
    this.checkinDate = checkinDate;
    this.permission = permission;
}

//getters and setters
}

ApiClient.java

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

Снимок экрана POSTMAN

enter image description here

Ответы [ 2 ]

0 голосов
/ 04 июня 2019

В Почтальоне вы отправляете form-data вместо raw, поэтому API возвращает ответ. В Retrofit вы отправляете запрос raw JSON. Я думаю, что API принимает multipart/form-data. Просто настройте интерфейс API следующим образом:

import okhttp3.RequestBody;
import retrofit2.http.PartMap;
import retrofit2.http.Multipart;

@Multipart        //   <====== add this line
@POST("User/login")
@Headers("x-api-key: 123456")
Call<LoginResponse> login(@PartMap Map<String, RequestBody> params);  // change parameters 

А в активности / фрагменте настройте код

Map<String, RequestBody> params = new HashMap<>();
params.put("email", RequestBody.create(MultipartBody.FORM, email));
params.put("password", RequestBody.create(MultipartBody.FORM, password));
params.put("deviceType", RequestBody.create(MultipartBody.FORM, String.valueOf(deviceType)));
params.put("deviceId", RequestBody.create(MultipartBody.FORM, deviceId));
params.put("versionName", RequestBody.create(MultipartBody.FORM, versionName));

YourApiInterface api = ...
Call<LoginResponse> call = api.login(params);   // pass it to method
call.enqueue(/* implementation */);

Пожалуйста, проверьте (и поймите) разницу между form-data, x-www-form-urlencoded и raw

Примечание. Пожалуйста, проверьте операторы импорта и комментарии к коду.

0 голосов
/ 03 июня 2019

Попробуйте так:

 @FormUrlEncoded
 @Headers("x-api-key: 123456")
 @POST("User/login")
 Call<LoginResponse> login(@Field("email") email, @Field("password") password,@Field("deviceType") deviceType,@Field("deviceId") deviceId,@Field("versionName") versionName);
...