it-swarm.com.ru

Как получить ответ в виде строки, используя модификацию без использования GSON или любой другой библиотеки в android

Я пытаюсь получить ответ от следующего API:

https://api.github.com/users/username

Но я не знаю, как получить ответ как String, чтобы я мог использовать String для анализа и получения JSONObject.

Используется модифицированная версия:

модифицированная: 2.0.0-beta1

Я пробовал это до сих пор:

public interface GitHubService {
        @GET("/users/{user}")
        public String listRepos(@Path("user") String user,Callback<String> callback);
    }

получение:

GitHubService service = retrofit.create(GitHubService.class);
        service.listRepos("username", new Callback<String>() {
            @Override
            public void onResponse(Response response) {
                System.out.println(response.toString());
            }

            @Override
            public void onFailure(Throwable t) {

            }
        });

исключение:

Caused by: Java.lang.IllegalArgumentException: Could not locate call adapter for class Java.lang.String. Tried:
    * retrofit.ExecutorCallAdapterFactory
            at retrofit.Utils.resolveCallAdapter(Utils.Java:67)
            at retrofit.MethodHandler.createCallAdapter(MethodHandler.Java:49)

Любая помощь могла бы быть полезна.

92
Aakash

** Обновление ** В модификацию был добавлен скалярный конвертер, который позволяет получить ответ String с меньшей церемонией, чем мой первоначальный ответ ниже.

Пример интерфейса -

public interface GitHubService {
    @GET("/users/{user}")
    Call<String> listRepos(@Path("user") String user);
}

Добавьте ScalarsConverterFactory к вашему модификатору сборки. Примечание: Если используется ScalarsConverterFactory и другая фабрика, сначала добавьте фабрику скаляров.

Retrofit retrofit = new Retrofit.Builder()
    .baseUrl(BASE_URL)
    .addConverterFactory(ScalarsConverterFactory.create())
    // add other factories here, if needed.
    .build();

Вам также нужно будет включить конвертер скаляров в ваш файл Gradle -

implementation 'com.squareup.retrofit2:converter-scalars:2.1.0'

--- Оригинальный ответ (все еще работает, просто больше кода) ---

Я согласен с @CommonsWare, что кажется странным, что вы хотите перехватить запрос для самостоятельной обработки JSON. В большинстве случаев POJO имеет все необходимые данные, поэтому нет необходимости возиться с землей JSONObject. Я подозреваю, что ваша конкретная проблема может быть лучше решена с помощью пользовательского gson TypeAdapter или модификации Converter , если вам нужно манипулировать JSON. Тем не менее, модернизация обеспечивает больше просто разбор JSON через Gson. Он также управляет множеством других утомительных задач, связанных с запросами REST. То, что вы не хотите использовать одну из функций, не означает, что вы должны выбросить все это. Есть моменты, когда вы просто хотите получить сырой поток, вот как это сделать -

Во-первых, если вы используете Retrofit 2, вы должны начать использовать API Call. Вместо отправки объекта для преобразования в качестве параметра типа используйте ResponseBody из okhttp -

public interface GitHubService {
    @GET("/users/{user}")
    Call<ResponseBody> listRepos(@Path("user") String user);
}

тогда вы можете создать и выполнить свой звонок -

GitHubService service = retrofit.create(GitHubService.class);
Call<ResponseBody> result = service.listRepos(username);
result.enqueue(new Callback<ResponseBody>() {
    @Override
    public void onResponse(Response<ResponseBody> response) {
        try {
            System.out.println(response.body().string());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onFailure(Throwable t) {
        e.printStackTrace();
    }
});

Примечание Приведенный выше код вызывает string() для объекта ответа, который считывает весь ответ в строку. Если вы передаете тело чему-то, что может принимать потоки, вы можете вместо этого вызвать charStream(). Смотрите ResponseBody документы.

188
iagreen