Невозможно получить JSON как строку из REST API

Я пытаюсь получить JSON из REST API в виде строки.

Я использую retrofit с scalarConverter для этой цели. Я могу передать URL-адрес для извлечения, и мой модифицированный экземпляр также успешно создан, но я не получаю никакого ответа от сервера. PS: на сервере нет запроса, значит, мой запрос не выходит с моей машины.

Я новичок в Android, пожалуйста, помогите мне.

Создание экземпляра модификации:

Retrofit retrofit=new Retrofit.Builder()
                .baseUrl(base)
                .addConverterFactory(ScalarsConverterFactory.create())
                .build();
jsonApi jsonapi=retrofit.create(jsonApi.class);
Call<String> stringcall=jsonapi.getStringResponse(speech);

Интерфейс jsonApi:

public interface jsonApi {
    @GET
    Call<String> getStringResponse(@Url String url);
}

основание: это базовый URL

речь: это переменная, содержащая остальную часть URL для обработки.

когда я запускаю, приложение зависает здесь с этим сообщением, отображаемым в Вкладка «Выполнить»:

W/OpenGLRenderer: Fail to change FontRenderer cache size, it already initialized
W/art: Before Android 4.1, method int android.support.v7.widget.DropDownListView.lookForSelectablePosition(int, boolean) would have incorrectly overridden the package-private method in android.widget.ListView
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
107
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

С нижней строкой

Call<String> stringcall=jsonapi.getStringResponse(speech);

вы просто получаете объект Call, который представляет собой HTTP-запрос, и именно поэтому запрос не выполняется. Вам нужно использовать этот объект и вызвать метод execute, чтобы сделать синхронный запрос, или метод enqueue, чтобы сделать асинхронный запрос.

Поэтому, если вы хотите сделать запрос на синхронизацию, попробуйте следующее:

Retrofit retrofit=new Retrofit.Builder()
                .baseUrl(base)
                .addConverterFactory(ScalarsConverterFactory.create())
                .build();
jsonApi jsonapi=retrofit.create(jsonApi.class);
Call<String> stringcall=jsonapi.getStringResponse(speech);
try {
    Response<String> response = stringcall.execute();
    String result = response.body();
} catch (Exception ex) { 
    //handle exception
}

Документация по интерфейсу Call: здесь, для справки.

Я попытался сделать запрос на синхронизацию методом execute(), но приложение вылетело. Итак, я попробовал метод enqueue, при котором приложение не падает, но ничего не показывает. @Madhu Вот фрагмент: stringcall.enqueue(new Callback<String>() { @Override public void onResponse(Call<String> call, Response<String> response) { //do something Log.d("here","here"); } @Override public void onFailure(Call<String> call, Throwable t) {} });

Syed Asnal Rizvi 28.05.2019 15:48

@SyedAsnalRizvi, в чем ошибка/исключение при сбое приложения при использовании метода execute?

Madhu Bhat 28.05.2019 15:56

W/System.err: android.os.NetworkOnMainThreadException W/System.err: at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(Stri‌​ctMode.java:1273) @Madhu Bhat

Syed Asnal Rizvi 28.05.2019 16:26

@SyedAsnalRizvi выглядит так, как будто сетевой вызов выполняется через поток пользовательского интерфейса. Можете ли вы попробовать ответ в stackoverflow.com/questions/13270372/…, который предлагает использовать AsyncTask для сетевых вызовов.

Madhu Bhat 28.05.2019 16:34

Я понял, спасибо за помощь. Очень признателен. @Мадху Бхат

Syed Asnal Rizvi 28.05.2019 23:21

Другие вопросы по теме