Android / Retrofit: приложение не общается через http, только через https - PullRequest
0 голосов
/ 24 августа 2018

Я пытаюсь создать приложение для Android, которое будет взаимодействовать с сервером по протоколу http. Я использую Retrofit для отправки запроса GET на сервер, но всегда получаю следующую ошибку:

java.net.UnknownServiceException: CLEARTEXT communication to http://demo5373349.mockable.io/ not permitted by network security policy

Хотя при попытке доступа к серверу через https такой проблемы не возникает, я также буду писать на стороне сервера и должен использовать http.

Вот код:

private TextView textView;
private EditText editText;
private Button getButton;
private Retrofit retrofit;
private ServerConnection connection;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    retrofit = new Retrofit.Builder()
            .baseUrl("http://demo5373349.mockable.io/")
            .addConverterFactory(GsonConverterFactory.create())
            .build();

    connection = retrofit.create(ServerConnection.class);

    textView = findViewById(R.id.textView);
    editText = findViewById(R.id.editText);
    getButton = findViewById(R.id.buttonGET);
    getButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            getHandler();
        }
    });

}

private void getHandler(){
    connection.sendGET().enqueue(new Callback<Message>() {
        @Override
        public void onResponse(Call<Message> call, Response<Message> response) {
            if(response.isSuccessful()) {
                textView.setText(response.body().toString());
            }else {
                textView.setText("Server Error");
            }
        }

        @Override
        public void onFailure(Call<Message> call, Throwable t) {
            textView.setText("Connection Error");
        }
    });
}

И интерфейс:

public interface ServerConnection {
    @GET("./")
    Call<Message> sendGET();
}

1 Ответ

0 голосов
/ 08 ноября 2018

Начиная с Android 9.0 (SDK 28) использование открытого сетевого обмена данными по умолчанию отключено.См. Открытый текст Android 9.0 (SDK 28) отключен

У вас есть несколько вариантов в порядке предпочтения безопасности:

  • Измените весь доступ к сети для использования HTTPS.
  • Добавьте файл конфигурации безопасности сети в ваш проект.
  • Включите поддержку Cleartext для приложения, добавив android:usesCleartextTraffic="true" к приложению в манифесте.

Для добавленияФайл сетевой безопасности для вашего проекта, вам нужно сделать две вещи.Вам необходимо добавить спецификацию файла в манифест:

<application android:networkSecurityConfig="@xml/network_security_config" .../>

Во-вторых, создайте файл res / xml / network_security_config.xml и укажите свои требования безопасности:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">insecure.example.com</domain>
    </domain-config>
</network-security-config>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...