Каков наилучший способ изменить пользовательский агент по умолчанию для приложения Android для сетевого запроса с помощью внешнего API?

#java #android #retrofit #okhttp

#java #Android #модернизация #okhttp

Вопрос:

В настоящее время я разрабатываю свое первое приложение, и у меня нет большого опыта работы с сетями и разработкой в целом, поэтому я мог бы воспользоваться некоторой помощью. Как указано в вопросе, мне необходимо установить пользовательский пользовательский агент для всех сетевых запросов, но у меня возникли проблемы. Я настроил прерывание OkHttp, но это, похоже, не работает.

Мой код для OkHttp таков:

 static class UserAgentInterceptor implements Interceptor{
        public String useragent;
        public UserAgentInterceptor(String useragent){
            this.useragent = useragent;

        }
        public UserAgentInterceptor() {
            this(String.format(Locale.US,
                    "%s/%s (Android %s; %s; %s %s; %s)",
                    "MY APP HERE",
                    "3.9",
                    Build.VERSION.RELEASE,                
                    Build.MODEL,
                    Build.BRAND,
                    Build.DEVICE,
                    Locale.getDefault().getLanguage()));
        }

        @NotNull
        @Override
        public Response intercept(Chain chain) throws IOException {
        
            Request userAgentRequest = chain.request()
                    .newBuilder()
                    .header("User-Agent", useragent)
                    .build();
            return chain.proceed(userAgentRequest);
        }

    }


@Override
    protected void onCreate(Bundle savedInstanceState) {
        new UserAgentInterceptor();
        super.onCreate(savedInstanceState);


        setContentView(R.layout.activity_main);
}
  

Я не думаю, что у меня есть какие-либо проблемы с внедрением OkHttp в мое приложение (я правильно поместил реализацию в свой файл build.gradle), поэтому проблема должна быть в другом месте.

Я могу ошибаться, но я предполагаю, что это связано с тем, что мое приложение выполняет не http-запросы, а внешний API. Еще раз, позвольте мне сказать, что это всего лишь моя теория о том, почему она не работает. Если это действительно причина, по которой у меня возникает эта ошибка, может ли быть способ обойти это (возможно, модернизация)?

Я ценю любую помощь в решении этой проблемы, а также объяснение того, для чего на самом деле требуется модернизация, поскольку я тоже не слишком уверен в этом. Спасибо.

Ответ №1:

Вам нужно добавить перехватчик к клиенту с помощью addInterceptor

https://square.github.io/okhttp/interceptors/#application-interceptors

 OkHttpClient client = new OkHttpClient.Builder()
    .addInterceptor(new LoggingInterceptor())
    .build();

Request request = new Request.Builder()
    .url("http://www.publicobject.com/helloworld.txt")
    .header("User-Agent", "OkHttp Example")
    .build();

Response response = client.newCall(request).execute();
response.body().close();
  

Комментарии:

1. Я видел подобный материал ранее, но где я запутался, так это раздел url при создании запроса. Поскольку я вызываю внешний API (Google Admob, я хочу изменить свой пользовательский агент, продолжая получать объявления для тестирования), у меня нет URL-адреса для ввода. Вместо этого я создаю AdRequest() , и этот API вызывает случайные URL-адреса, которые запрашиваются в моей сети.