Ошибка при публикации данных на сервер с использованием дооснащения - PullRequest
0 голосов
/ 29 октября 2018

Я пытаюсь отправить данные из моего приложения на сервер с помощью модернизации. Я отправляю данные в формате JSON на интерфейс. Этот веб-сервис работает с почтальоном, но при использовании в приложении выдает следующую ошибку

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 2 column 1 path $

Во время отладки я вижу, что мои данные в правильном формате json, как показано ниже

{
"login_id":39,
"contact_no":"91775668"}

Вот мой метод отправки данных на сервер

  JSONObject object=new JSONObject();
    try {

        object.put("login_id",loginID);
        object.put("contact_no",mobileNumber);

        Call<OTPResponse>call=userService.getOTP(key,object.toString());
        call.enqueue(new Callback<OTPResponse>() {
            @Override
            public void onResponse(Call<OTPResponse> call, Response<OTPResponse> response) {

                }else {


                }

И мой метод POST из интерфейса

    @Headers("Content-Type:application/json")
    @POST(OTP_URL)
    Call<OTPResponse>getOTP(@Header("API-KEY")String key,@Body String otpdetails);


OTPResponse.java


public class OTPResponse {


    @Expose
    @SerializedName("message")
    private String message;
    @Expose
    @SerializedName("OTP")
    private String OTP;
    @Expose
    @SerializedName("status")
    private boolean status;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public String getOTP() {
        return OTP;
    }

    public void setOTP(String OTP) {
        this.OTP = OTP;
    }

    public boolean getStatus() {
        return status;
    }

    public void setStatus(boolean status) {
        this.status = status;
    }
}

ответ от сервера

    {
    "status": true,
    "OTP": "422733",
    "message": "OTP sent successfully."
}

Ответы [ 4 ]

0 голосов
/ 29 октября 2018

В этой строке вы конвертируете свой json в строку. Пожалуйста, измените 2-й параметр функции getOtp () в json и user

Call<OTPResponse>call=userService.getOTP(key,object);

не

Call<OTPResponse>call=userService.getOTP(key,object.toString());

0 голосов
/ 29 октября 2018

Вы должны изменить свой вызов API с помощью приведенного ниже кода.

public class PostData {

private String id;
private String phone;

public PostData(String id, String phone) {
    this.id= id;
    this.phone = phone;
}

public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}

public String getPhone() {
    return phone;
}
public void setPhone(String phone) {
    this.phone= phone;
}

}

Метод интерфейса

@Headers("Content-Type:application/json")
@POST(OTP_URL)
Call<OTPResponse>getOTP(@Header("API-KEY")String key,
@Body PostData body);

и измените ваш запрос, как показано ниже

 JSONObject object=new JSONObject();
 try {

    Call<OTPResponse>call=userService.getOTP(key,new PostData(email,password));
    call.enqueue(new Callback<OTPResponse>() {
        @Override
        public void onResponse(Call<OTPResponse> call, Response<OTPResponse> response) {
        } else { }
0 голосов
/ 29 октября 2018

Сделай это

Call<OTPResponse>getOTP(@Header("API-KEY")String key,@Body("login_id") String loginId, @Body("contact_no") String contactNo);

Вы можете передавать целые числа вместо строки, если хотите.

Кроме того, я думаю, вам также потребуется @FormUrlEncoded для запроса POST.

@FormUrlEncoded
@POST(OTP_URL)
Call<OTPResponse>getOTP(@Header("API-KEY")String key,@Body("login_id") String loginId, @Body("contact_no") String contactNo);

РЕДАКТИРОВАТЬ: @FormUrlEncoded вместо @URLFormEncoded.

0 голосов
/ 29 октября 2018

Решение:

Вместо записи строки в @Body:

Call<OTPResponse>getOTP(@Header("API-KEY")String key,@Body String otpdetails);

Используйте это:

Call<OTPResponse>getOTP(@Header("API-KEY")String key,@Body JsonObject otpdetails);

и ваш вызов метода должен быть:

Call<OTPResponse>call=userService.getOTP(key, object);

Вместо:

Call<OTPResponse>call=userService.getOTP(key,object.toString());

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

ОБНОВЛЕНИЕ: Как уже упоминалось NIKHIL , попробуйте добавить @FormUrlEncoded, чтобы решить Internal server error. Итак, обновленный код должен быть:

@FormUrlEncoded
@POST(OTP_URL)
Call<OTPResponse>getOTP(@Header("API-KEY")String key, @Body JsonObject otpdetails);

Попробуйте сейчас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...