java.lang.IllegalStateException: ожидалось BEGIN_OBJECT, но было STRING в строке 1, столбце 1, пути $
Я перепроверил много ссылок, прежде чем задавать вопрос. Как и большинство людей, я звоню в веб-сервис и получаю вышеуказанный результат. Моя проблема более конкретна, поэтому прежде чем спрашивать, позвольте мне добавить code snippet
public static WebService getRestService(String newApiBaseUrl, String accessToken)
{
OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
if (BuildConfig.DEBUG) {
HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(HttpLoggingInterceptor.Level.BODY);
httpClient.addInterceptor(logging);
}
Gson gson = new GsonBuilder()
.setLenient()
.create();
restBuilder = new Retrofit.Builder()
.baseUrl(newApiBaseUrl)
.client(httpClient.build())
.addConverterFactory(GsonConverterFactory.create(gson));
if (accessToken != null) {
AuthenticationInterceptor interceptor =
new AuthenticationInterceptor(accessToken);
if (!httpClient.interceptors().contains(interceptor)) {
httpClient.addInterceptor(interceptor);
restBuilder.client(httpClient.build());
}
}
retrofit = restBuilder.build();
return retrofit.create(WebService.class);
}
Пожалуйста, игнорируйте переводчика. Это мой класс генератора услуг, через который вызывается весь веб-сервис. Я вызываю метод POST, который вернет мне простой ответ.
Я вижу свой правильный ответ в "Android Monitor". Но когда он проходит через JsonConverterFactory, он выдает мне ошибку выше. Одно я точно знаю, что веб-сервис возвращает простой текстовый ответ, так как нет ничего конкретного для возврата в приложение. Есть ли способ, которым я могу преобразовать свой текстовый ответ в класс. Пожалуйста, кричите, если я что-то пропустил.
Также добавляю мой метод интерфейса
@Headers({
Constants.ApiHeader.CONTENT_TYPE_JSON
})
@POST("POST_URL/{number}")
Call<MyResponseModel> getActualProductLocation(@Header("access_token") String accessToken, @Path("number") String number, @Body List<MyRequestModel> body);
Обновление Мне удалось получить фрагмент кода с сервера. Вот как выглядит их ответ:
Response.status(200).entity("Response Success").build()
1 ответ
Поскольку серверная часть не отвечает вам данными в формате JSON, вы должны обработать их с помощью специального конвертера.
Вот пример пользовательского конвертера, который будет соответствовать вашим потребностям.
Фрагмент из StringConverterFactory.java
...
private static class StringConverter implements Converter<String> {
private static final MediaType PLAIN_TEXT = MediaType.parse("text/plain; charset=UTF-8");
@Override
public String fromBody(ResponseBody body) throws IOException {
return new String(body.bytes());
}
@Override
public RequestBody toBody(String value) {
return RequestBody.create(PLAIN_TEXT, convertToBytes(value));
}
private static byte[] convertToBytes(String string) {
try {
return string.getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}
}
...
А потом при создании вашего Retrofit
:
Retrofit retrofit = new Retrofit.Builder()
...
.addConverterFactory(StringConverterFactory.create());
...
.build();