Как устранить ошибку «Сбой при рукопожатии» при доступе к ASP.net WebAPI из проекта Android Studio? - PullRequest
0 голосов
/ 26 сентября 2019

Я полагаю, что мне не хватает чего-то важного, но я не могу понять, как связаться с API из моего проекта Android на localhost.Я почти следил за этим учебником , который устарел, поэтому я пытался обновить его до текущей версии Android Studio.Тем не менее, я зашел в тупик, я получил это Handshake failed, которое я не могу решить.

РЕДАКТИРОВАТЬ: я хотел бы отметить, что я могу получить доступ к API из браузера на эмуляторе, и он предоставляет запрошенную информацию, но при извлечении из приложения выдает ошибку, упомянутую ранее.

Ниже мой RestService, который, как я считаю, должен соединиться с моим URL, наряду с некоторыми правками, основанными на поиске в Интернете, который должен был помочь, но не помог.

package com.example.newrestapi;

import java.util.Collections;
import java.util.concurrent.TimeUnit;

import okhttp3.CipherSuite;
import okhttp3.ConnectionSpec;
import okhttp3.OkHttpClient;
import okhttp3.TlsVersion;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.converter.gson.GsonConverterFactory;

public class RestService {
    //You need to change the IP if you testing environment is not local machine
    //or you may have different URL than we have here
    private static final String URL = "https://10.0.2.2:80/";
    private retrofit2.Retrofit restAdapter;
    private InstituteService apiService;
    HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();


    public RestService()
    {

        ConnectionSpec spec = new ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS)
                .tlsVersions(TlsVersion.TLS_1_2)
                .cipherSuites(
                        CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
                        CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
                        CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
                        CipherSuite.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
                ).build();

        //OkHttpClient okHttpClient = UnsafeOkHttpClient.getUnsafeOkHttpClient();
        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        OkHttpClient client = new OkHttpClient.Builder()
                .addInterceptor(interceptor)
                .readTimeout(180, TimeUnit.SECONDS)
                .connectTimeout(180, TimeUnit.SECONDS)
                .connectionSpecs(Collections.singletonList(spec))
                .build();

        restAdapter = new retrofit2.Retrofit.Builder()
                .baseUrl(URL)
                .addConverterFactory(GsonConverterFactory.create())
                .client(client)
                .build();

        apiService = restAdapter.create(InstituteService.class);
    }



    public InstituteService getService()
    {
        return apiService;
    }
}

А вот мой звонокк этому сервису и InstituteService Интерфейсу, который включает GET и SET:

 private void refreshScreen(){
        //Call to server to grab list of student records. this is a asyn
        InstituteService serv = restService.getService();
        Call<List<Student>> response = serv.getStudent();
        response.enqueue(new Callback<List<Student>>() {
            @Override
            public void onResponse(Call<List<Student>> students, Response<List<Student>> response) {
                ListView lv = findViewById(R.id.listView);

                CustomAdapter customAdapter = new CustomAdapter(MainActivity.this, R.layout.view_student_entry, response.body());

                lv.setOnItemClickListener((parent, view, position, id) -> {
                    student_Id = view.findViewById(R.id.student_Id);
                    String studentId = student_Id.getText().toString();
                    Intent objIndent = new Intent(getApplicationContext(), StudentDetail.class);
                    objIndent.putExtra("student_Id", Integer.parseInt(studentId));
                    startActivity(objIndent);
                });
                lv.setAdapter(customAdapter);
            }

            @Override
            public void onFailure(Call<List<Student>> call, Throwable throwable) {
                Log.e("MAIN", throwable.getMessage());
                Toast.makeText(MainActivity.this, throwable.getMessage(), Toast.LENGTH_LONG).show();

            }

        });

    }

Я также создал network_security_config xml и установил android:usesCleartextTraffic="true" в манифесте.

Любая помощьв полном понимании и выполнении этой задачи будет оценено.

РЕДАКТИРОВАТЬ: Или какой-либо пункт в направлении учебника?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...