J'utilise Retrofit library dans mon application et j'aimerais définir un délai d'attente de 60 secondes. Retrofit a-t-il un moyen de le faire?
Je règle Retrofit de cette façon:
RestAdapter restAdapter = new RestAdapter.Builder()
.setServer(BuildConfig.BASE_URL)
.setConverter(new GsonConverter(gson))
.build();
Comment puis-je définir le délai d'attente?
Vous pouvez définir des délais d'attente sur le client HTTP sous-jacent. Si vous ne spécifiez pas de client, Retrofit en créera un avec les délais de connexion et de lecture par défaut. Pour définir vos propres délais, vous devez configurer votre propre client et le fournir au RestAdapter.Builder
.
Une option consiste à utiliser le client OkHttp , également depuis Square.
1. Ajouter la dépendance de la bibliothèque
Dans le build.gradle, incluez cette ligne:
compile 'com.squareup.okhttp:okhttp:x.x.x'
Où x.x.x
est la version de la bibliothèque souhaitée.
2. Définir le client
Par exemple, si vous souhaitez définir un délai d'expiration de 60 secondes, procédez de cette manière pour Retrofit avant la version 2 et Okhttp avant la version 3 (POUR LES VERSIONS LES PLUS NOUVELLES, VOIR LES ÉDITS):
public RestAdapter providesRestAdapter(Gson gson) {
final OkHttpClient okHttpClient = new OkHttpClient();
okHttpClient.setReadTimeout(60, TimeUnit.SECONDS);
okHttpClient.setConnectTimeout(60, TimeUnit.SECONDS);
return new RestAdapter.Builder()
.setEndpoint(BuildConfig.BASE_URL)
.setConverter(new GsonConverter(gson))
.setClient(new OkClient(okHttpClient))
.build();
}
EDIT 1
Pour les versions okhttp depuis 3.x.x
, vous devez définir la dépendance de la manière suivante:
compile 'com.squareup.okhttp3:okhttp:x.x.x'
Et définissez le client à l'aide du modèle de générateur:
final OkHttpClient okHttpClient = new OkHttpClient.Builder()
.readTimeout(60, TimeUnit.SECONDS)
.connectTimeout(60, TimeUnit.SECONDS)
.build();
Plus d'infos dans Timeouts
EDIT 2
Les versions ultérieures depuis 2.x.x
utilisent également le modèle de générateur. Modifiez donc le bloc de retour ci-dessus comme suit:
return new Retrofit.Builder()
.baseUrl(BuildConfig.BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.client(okHttpClient)
.build();
Si vous utilisez un code tel que ma méthode providesRestAdapter
, changez le type de retour de la méthode en Retrofit .
Plus d'infos dans Retrofit 2 - Guide de mise à jour à partir de 1.9
ps: Si votre minSdkVersion est supérieur à 8, vous pouvez utiliser TimeUnit.MINUTES
:
okHttpClient.setReadTimeout(1, TimeUnit.MINUTES);
okHttpClient.setConnectTimeout(1, TimeUnit.MINUTES);
Pour plus de détails sur les unités, voir TimeUnit .
Ces réponses étaient obsolètes pour moi, alors voici comment cela a fonctionné.
Ajoutez OkHttp, dans mon cas, la version est 3.3.1
:
compile 'com.squareup.okhttp3:okhttp:3.3.1'
Ensuite, avant de construire votre rénovation, procédez comme suit:
OkHttpClient okHttpClient = new OkHttpClient().newBuilder()
.connectTimeout(60, TimeUnit.SECONDS)
.readTimeout(60, TimeUnit.SECONDS)
.writeTimeout(60, TimeUnit.SECONDS)
.build();
return new Retrofit.Builder()
.baseUrl(baseUrl)
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create())
.build();
public class ApiClient {
private static Retrofit retrofit = null;
private static final Object LOCK = new Object();
public static void clear() {
synchronized (LOCK) {
retrofit = null;
}
}
public static Retrofit getClient() {
synchronized (LOCK) {
if (retrofit == null) {
Gson gson = new GsonBuilder()
.setLenient()
.create();
OkHttpClient okHttpClient = new OkHttpClient().newBuilder()
.connectTimeout(40, TimeUnit.SECONDS)
.readTimeout(60, TimeUnit.SECONDS)
.writeTimeout(60, TimeUnit.SECONDS)
.build();
retrofit = new Retrofit.Builder()
.client(okHttpClient)
.baseUrl(Constants.WEB_SERVICE)
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
}
return retrofit;
}
}
public static RequestBody plain(String content) {
return getRequestBody("text/plain", content);
}
public static RequestBody getRequestBody(String type, String content) {
return RequestBody.create(MediaType.parse(type), content);
}
}
@FormUrlEncoded
@POST("architect/project_list_Design_files")
Call<DesignListModel> getProjectDesign(
@Field("project_id") String project_id);
@Multipart
@POST("architect/upload_design")
Call<BoqListModel> getUpLoadDesign(
@Part("user_id") RequestBody user_id,
@Part("request_id") RequestBody request_id,
@Part List<MultipartBody.Part> image_file,
@Part List<MultipartBody.Part> design_upload_doc);
private void getMyProjectList()
{
ApiInterface apiService = ApiClient.getClient().create(ApiInterface.class);
Call<MyProjectListModel> call = apiService.getMyProjectList("",Sorting,latitude,longitude,Search,Offset+"",Limit);
call.enqueue(new Callback<MyProjectListModel>() {
@Override
public void onResponse(Call<MyProjectListModel> call, Response<MyProjectListModel> response) {
try {
Log.e("response",response.body()+"");
} catch (Exception e)
{
Log.e("onResponse: ", e.toString());
}
}
@Override
public void onFailure(Call<MyProjectListModel> call, Throwable t)
{
Log.e( "onFailure: ",t.toString());
}
});
}
// file upload
private void getUpload(String path,String id)
{
ApiInterface apiService = ApiClient.getClient().create(ApiInterface.class);
MultipartBody.Part GalleryImage = null;
if (path!="")
{
File file = new File(path);
RequestBody reqFile = RequestBody.create(MediaType.parse("multipart/form-data"), file);
GalleryImage = MultipartBody.Part.createFormData("image", file.getName(), reqFile);
}
RequestBody UserId = RequestBody.create(MediaType.parse("text/plain"), id);
Call<uplod_file> call = apiService.geUplodFileCall(UserId,GalleryImage);
call.enqueue(new Callback<uplod_file>() {
@Override
public void onResponse(Call<uplod_file> call, Response<uplod_file> response) {
try {
Log.e("response",response.body()+"");
Toast.makeText(getApplicationContext(),response.body().getMessage(),Toast.LENGTH_SHORT).show();
} catch (Exception e)
{
Log.e("onResponse: ", e.toString());
}
}
@Override
public void onFailure(Call<uplod_file> call, Throwable t)
{
Log.e( "onFailure: ",t.toString());
}
});
}
implementation 'com.squareup.retrofit2:retrofit:2.4.0'
implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
Pour Retrofit1.9 avec les utilisateurs OkHttp3, voici la solution,
.setClient(new Ok3Client(new OkHttpClient.Builder().readTimeout(60, TimeUnit.SECONDS).build()))
J'utilise Retrofit 1.9 pour obtenir unXML.
public class ServicioConexionRetrofitXML {
public static final String API_BASE_URL = new GestorPreferencias().getPreferencias().getHost();
public static final long tiempoMaximoRespuestaSegundos = 60;
public static final long tiempoMaximoLecturaSegundos = 100;
public static final OkHttpClient clienteOkHttp = new OkHttpClient();
private static RestAdapter.Builder builder = new RestAdapter.Builder().
setEndpoint(API_BASE_URL).
setClient(new OkClient(clienteOkHttp)).setConverter(new SimpleXMLConverter());
public static <S> S createService(Class<S> serviceClass) {
clienteOkHttp.setConnectTimeout(tiempoMaximoRespuestaSegundos, TimeUnit.SECONDS);
clienteOkHttp.setReadTimeout(tiempoMaximoLecturaSegundos, TimeUnit.SECONDS);
RestAdapter adapter = builder.build();
return adapter.create(serviceClass);
}
}
Si vous utilisez Retrofit 1.9.0 et okhttp 2.6.0, ajoutez-les à votre fichier Gradle.
compile 'com.squareup.retrofit:retrofit:1.9.0'
compile 'com.squareup.okhttp:okhttp:2.6.0'
// Librería de retrofit para XML converter (Simple) Se excluyen grupos para que no entre
// en conflicto.
compile('com.squareup.retrofit:converter-simplexml:1.9.0') {
exclude group: 'xpp3', module: 'xpp3'
exclude group: 'stax', module: 'stax-api'
exclude group: 'stax', module: 'stax'
}
Remarque: Si vous devez récupérer unJSON, supprimez simplement le code ci-dessus.
.setConverter(new SimpleXMLConverter())
J'ai trouvé cet exemple
https://github.com/square/retrofit/issues/1557
Ici, nous définissons le client de connexion client url personnalisé avant de construire l’implémentation du service de repos API.
import com.google.gson.Gson
import com.google.gson.GsonBuilder
import retrofit.Endpoint
import retrofit.RestAdapter
import retrofit.client.Request
import retrofit.client.UrlConnectionClient
import retrofit.converter.GsonConverter
class ClientBuilder {
public static <T> T buildClient(final Class<T> client, final String serviceUrl) {
Endpoint mCustomRetrofitEndpoint = new CustomRetrofitEndpoint()
Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create()
RestAdapter.Builder builder = new RestAdapter.Builder()
.setEndpoint(mCustomRetrofitEndpoint)
.setConverter(new GsonConverter(gson))
.setClient(new MyUrlConnectionClient())
RestAdapter restAdapter = builder.build()
return restAdapter.create(client)
}
}
public final class MyUrlConnectionClient extends UrlConnectionClient {
@Override
protected HttpURLConnection openConnection(Request request) {
HttpURLConnection connection = super.openConnection(request);
connection.setConnectTimeout(15 * 1000);
connection.setReadTimeout(30 * 1000);
return connection;
}
}
public class ApiModule {
public WebService apiService(Context context) {
String mBaseUrl = context.getString(BuildConfig.DEBUG ? R.string.local_url : R.string.live_url);
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
loggingInterceptor.setLevel(BuildConfig.DEBUG ? HttpLoggingInterceptor.Level.BODY : HttpLoggingInterceptor.Level.NONE);
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.readTimeout(120, TimeUnit.SECONDS)
.writeTimeout(120, TimeUnit.SECONDS)
.connectTimeout(120, TimeUnit.SECONDS)
.addInterceptor(loggingInterceptor)
//.addNetworkInterceptor(networkInterceptor)
.build();
return new Retrofit.Builder().baseUrl(mBaseUrl)
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build().create(WebService.class);
}
}
Ce sera le meilleur moyen de définir le délai d'expiration de chaque service (délai d'expiration défini en paramètre).
public static Retrofit getClient(String baseUrl, int serviceTimeout) {
Retrofit retrofitselected = baseUrl.contains("http:") ? retrofit : retrofithttps;
if (retrofitselected == null || retrofitselected.equals(retrofithttps)) {
retrofitselected = new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create(getGson().create()))
.client(!BuildConfig.FLAVOR.equals("PRE") ? new OkHttpClient.Builder()
.addInterceptor(new ResponseInterceptor())
.connectTimeout(serviceTimeout, TimeUnit.MILLISECONDS)
.writeTimeout(serviceTimeout, TimeUnit.MILLISECONDS)
.readTimeout(serviceTimeout, TimeUnit.MILLISECONDS)
.build() : getUnsafeOkHttpClient(serviceTimeout))
.build();
}
return retrofitselected;
}
Et ne manquez pas cela pour OkHttpClient.
private static OkHttpClient getUnsafeOkHttpClient(int serviceTimeout) {
try {
// Create a trust manager that does not validate certificate chains
final TrustManager[] trustAllCerts = new TrustManager[] {
new X509TrustManager() {
@Override
public void checkClientTrusted(Java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public void checkServerTrusted(Java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public Java.security.cert.X509Certificate[] getAcceptedIssuers() {
return new Java.security.cert.X509Certificate[]{};
}
}
};
// Install the all-trusting trust manager
final SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, trustAllCerts, new Java.security.SecureRandom());
// Create an ssl socket factory with our all-trusting manager
final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.sslSocketFactory(sslSocketFactory);
builder.hostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
OkHttpClient okHttpClient = builder
.addInterceptor(new ResponseInterceptor())
.connectTimeout(serviceTimeout, TimeUnit.MILLISECONDS)
.writeTimeout(serviceTimeout, TimeUnit.MILLISECONDS)
.readTimeout(serviceTimeout, TimeUnit.MILLISECONDS)
.build();
return okHttpClient;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
J'espère que cela aidera n'importe qui.