我想将注册表单发送给服务器进行翻新。首先我有这个错误:
使用JsonReader.setLenient(true)在第1行第1列路径$处接受格式错误的JSON。
我正在尝试通过向 Retrofit.Builder 中添加 Gson 来修复该问题,
Gson gson = new GsonBuilder()
.setLenient()
.create();
return new Retrofit.Builder()
.baseUrl(AppConfig.BASE_URL)
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
现在,我遇到此错误:
预期为BEGIN_OBJECT,但位于第2行第1列的路径$
我的服务器响应如下:
{
"status": 1,
"message": "Successful"
}
如何解决?
更新
我的界面Api:
public interface SignUpApi {
@Multipart
@POST("signup_profile")
Call<SignUpResponseModel> uploadFile(@Part MultipartBody.Part file,
@Part("sample_disc") RequestBody imageFile,
@Part("name") RequestBody name,
@Part("phone") RequestBody phone,
@Part("email") RequestBody email,
@Part("password") RequestBody password,
@Part("username") RequestBody username);
}
发送信息代码并获得响应:
RequestBody requestBody = RequestBody.create(MediaType.parse("*/*"), file);
MultipartBody.Part fileToUpload = MultipartBody.Part.createFormData("file", file.getName(), requestBody);
RequestBody filename = RequestBody.create(MediaType.parse("text/plain"), file.getName());
RequestBody name = RequestBody.create(MediaType.parse("text/plain"), etName.getText().toString());
RequestBody phone = RequestBody.create(MediaType.parse("text/plain"), etPhone.getText().toString());
RequestBody email = RequestBody.create(MediaType.parse("text/plain"), etEmail.getText().toString());
RequestBody password = RequestBody.create(MediaType.parse("text/plain"), etPass.getText().toString());
RequestBody username = RequestBody.create(MediaType.parse("text/plain"), etUsername.getText().toString());
SignUpApi getResponse = AppConfig.getRetrofit().create(SignUpApi.class);
Call<SignUpResponseModel> call = getResponse.uploadFile(fileToUpload, filename, name, phone, email, password, username);
call.enqueue(new Callback<SignUpResponseModel>() {
@Override
public void onResponse(Call<SignUpResponseModel> call, Response<SignUpResponseModel> response) {
SignUpResponseModel signUpResponseModel = (SignUpResponseModel) response.body();
if (signUpResponseModel != null) {
if (signUpResponseModel.getStatus() == 1) {
startActivity(new Intent(SignupActivity.this, LoginActivity.class));
ToastMessage.showToast(context, signUpResponseModel.getMessage());
} else {
btnSend.setText(signUpResponseModel.getMessage());
}
} else {
assert signUpResponseModel != null;
}
}
@Override
public void onFailure(Call<SignUpResponseModel> call, Throwable t) {
Log.i("error", t.getMessage());
}
});
SignUpResponseModel:
public class SignUpResponseModel {
@SerializedName("status")
@Expose
private int status;
@SerializedName("message")
@Expose
private String message;
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
对PostMan的答复:
答案 0 :(得分:1)
我认为您从设备调用API时遇到了错误的JSON response
。这可能是服务器中的问题。假设当您使用邮递员调用API时,您将获得如下所示的预期响应(因为您的API调用正常)
{
"status": 1,
"message": "Successful"
}
当您从应用程序中调用API时,会从服务器收到错误的JSON response
,这意味着API调用不正确[由于许多原因,它可能会发生]。
"{
"status": 0,
"message": ""
}"
因此,您将得到一个例外,即您期望有一个对象作为响应,但是您正在获取一个字符串。
您可以从API获取响应,并使用ResponseBody
中的okhttp
将其转换为字符串,如下所示:
Call<ResponseBody> call = getResponse.uploadFile(fileToUpload, filename, name, phone, email, password, username);
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
try {
// here you can what response you are getting.
Log.d("JSON From Server", response.body().string());//convert reponse to string
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
Log.i("error", t.getMessage());
}
});
并在如下所示的API端点中使用ResponseBody
Call<ResponseBody> uploadFile.....
答案 1 :(得分:0)
您正在获取状态,并且消息响应显示url中设置的变量可能有冲突。我的意思是
@Part("sample_disc") RequestBody imageFile,
@Part("name") RequestBody name,// May be these variable name are not exact
@Part("phone") RequestBody phone,
@Part("email") RequestBody email,
@Part("password") RequestBody password,
@Part("username") RequestBody username);
答案 2 :(得分:0)
{ “状态”:1, ” 消息”:“成功” } 预期为BEGIN_OBJECT,但位于第2行第1列路径$
清楚地说,消息的响应值是字符串类型,但应该是JSON对象。 因此它可能不是JSON对象,而是“成功”。
答案 3 :(得分:0)
在您的响应中,您以字符串形式获取响应,但其需要json对象 例如
"{
"status": 1,
"message": "Successful"
}" -- you are getting this
but you required - {
"status": 1,
"message": "Successful"
}