使用改造将数据发布到服务器时出错

时间:2018-10-29 05:30:06

标签: android retrofit

我正在尝试使用改型将数据从我的应用程序发送到服务器。我正在将json格式的数据发送到接口。此Web服务可与邮递员一起使用,但在应用程序中使用时会出现以下错误

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 :(得分:0)

解决方案:

代替在@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);

立即尝试。

答案 1 :(得分:0)

您需要使用以下代码更改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 { }

答案 2 :(得分:0)

执行此操作

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

答案 3 :(得分:0)

在这一行中,您正在将json转换为字符串。请在json和user中更改getOtp()函数的第二个参数

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

不是

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