我正在尝试使用改型将数据从我的应用程序发送到服务器。我正在将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."
}
答案 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());