Я полагаю, что мне не хватает чего-то важного, но я не могу понять, как связаться с 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"
в манифесте.
Любая помощьв полном понимании и выполнении этой задачи будет оценено.
РЕДАКТИРОВАТЬ: Или какой-либо пункт в направлении учебника?