Дооснащение 2.0: ожидалось BEGIN_OBJECT, но было STRING в строке 1, путь 1, столбец $ - PullRequest
0 голосов
/ 12 апреля 2019

Я передал запрос на обновление для почтальона и получил успешный ответ (см. Изображение). Теперь, когда я пытаюсь сделать то же самое в своем приложении, используя Retrofit 2, я получаю ошибку как com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $.Интересно, что я сталкивался с этой ошибкой ранее, и я знаю, что это обычно происходит, если моя Модель не соответствует ответу.Но на этот раз я думаю, что проверил все коробки, но все равно я получаю ошибку.Если бы кто-нибудь мог понять, где я ошибаюсь ...

Мой ответ в Почтальоне:

enter image description here

Мое Pojo:

package com.example.evidya.Retrofit.Model.EditModel;

import java.util.List;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class EditResponse {
    @SerializedName("result")
    @Expose
    private String result;

    @SerializedName("response_code")
    @Expose
    private Integer responseCode;

    @SerializedName("msg")
    @Expose
    private String msg;

    @SerializedName("data")
    @Expose
    private List<Object> data = null;

    public String getResult() {
        return result;
    }

    public void setResult(String result) {
        this.result = result;
    }

    public Integer getResponseCode() {
        return responseCode;
    }

    public void setResponseCode(Integer responseCode) {
        this.responseCode = responseCode;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public List<Object> getData() {
        return data;
    }

    public void setData(List<Object> data) {
        this.data = data;
    }

}

Мой модифицированный клиент:

package com.example.evidya.Retrofit;

import com.example.evidya.Common.Common;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import java.util.concurrent.TimeUnit;

import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class RetrofitClient {
    public static Retrofit retrofit = null;
    public static Retrofit getRetrofit(){
        HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
        loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

        OkHttpClient.Builder httpClient = new OkHttpClient.Builder()        //adding custom interceptor
                .connectTimeout(10, TimeUnit.SECONDS)
                .readTimeout(20, TimeUnit.SECONDS)
                .writeTimeout(20, TimeUnit.SECONDS);
        httpClient.addInterceptor(loggingInterceptor); //add logging interceptor as the last interceptor,
                                                       // because this shall also show other interceptors
        Gson gson = new GsonBuilder()
                .setLenient()
                .create();

        if(retrofit == null){
            retrofit= new Retrofit.Builder()
                    .baseUrl(Common.baseUrl)
                    .addConverterFactory(GsonConverterFactory.create(gson))
                    .client(httpClient.build())
                    .build();
        }
        return retrofit;
    }
}

Модифицированный интерфейс:

@FormUrlEncoded
@PUT("user/update_user")
Call<EditResponse> updateUser(
    @HeaderMap Map<String, String> headers,
    @Field("user_id") String id,
    @Field("email") String email,
    @Field("name") String name,
    @Field("phone") String phone,
    @Field("access_token") String accessToken
);

Мой ответ OkHttp: enter image description here

Мой код:

private void saveRequest() {
    Log.d(TAG, "saveRequest: "+loginResponseData.getId());
    progressDialog.setMessage("Updating...");
    progressDialog.show();
    String name, email, mobile;

    name = mName.getText().toString();
    email = mEmail.getText().toString();
    mobile = mPhoneNumber.getText().toString();

    Call<EditResponse> editResponseCall = evidya.updateUser(Common.getHeaders(), loginResponseData.getId(), email, name, mobile, loginResponseData.getAccessToken());
    editResponseCall.enqueue(new Callback<EditResponse>() {
        private int retryCount = 0;

        @Override
        public void onResponse(Call<EditResponse> call, Response<EditResponse> response) {
            progressDialog.dismiss();
            if(!response.isSuccessful()){
                Toast.makeText(Edit_AccountActivity.this, ""+response.message(), Toast.LENGTH_SHORT).show();
                return;
            }

            EditResponse loginResponse = null;
            try {
                loginResponse = response.body();
            } catch (Exception e) {
                Log.d(TAG, "onResponse: error parsing"+e.toString());
            }

            if(loginResponse != null){
                if(loginResponse.getResult().toLowerCase().equals("success")){
                    Toast.makeText(Edit_AccountActivity.this, "Your details successfully updated", Toast.LENGTH_SHORT).show();
                } else{
                    Toast.makeText(Edit_AccountActivity.this, ""+loginResponse.getMsg(), Toast.LENGTH_SHORT).show();
                }

            } else{
                Toast.makeText(Edit_AccountActivity.this, "Invalid Response from server", Toast.LENGTH_SHORT).show();
            }
        }

        @Override
        public void onFailure(Call<EditResponse> call, Throwable t) {
            Log.d(TAG, "onFailure: "+t.toString());
            Toast.makeText(Edit_AccountActivity.this, ""+t.getMessage(), Toast.LENGTH_SHORT).show();
            progressDialog.dismiss();
        }


    });
}

1 Ответ

0 голосов
/ 12 апреля 2019

Обычно это происходит, когда вы получаете что-то, отличное от ожидаемого ответа от сервера.
Чтобы понять, что не так, попробуйте сымитировать ваш запрос в Почтальоне и посмотреть, что вы получаете с сервера.
Более того, вы можете включить Перехватчик ведения журнала OkHttp , чтобы точно узнать, что сервер возвращает в вашем Logcat.

...