Comment définir le délai d'expiration de la connexion avec OkHttp

173

Je développe une application en utilisant la bibliothèque OkHttp et mon problème est que je ne trouve pas comment définir le délai de connexion et le délai d'expiration du socket.

OkHttpClient client = new OkHttpClient();

Request request = new Request.Builder().url(url).build();

Response response = client.newCall(request).execute();
Kelvincer
la source
2
La réponse que vous avez sélectionnée n'est plus valide. Vous devriez peut-être modifier la question pour spécifier la version de okhttp.
Theyouthis le

Réponses:

324

Vous devez simplement le faire

OkHttpClient client = new OkHttpClient();
client.setConnectTimeout(15, TimeUnit.SECONDS); // connect timeout
client.setReadTimeout(15, TimeUnit.SECONDS);    // socket timeout

Request request = new Request.Builder().url(url).build();
Response response = client.newCall(request).execute();

Sachez que valeur définie dans setReadTimeoutest celui utilisé dans setSoTimeoutle Socketinterne dans la OkHttp Connectionclasse.

Ne pas définir de délai d'expiration sur le OkHttpClientéquivaut à définir une valeur de 0on setConnectTimeoutou setReadTimeoutet n'entraînera aucun délai d'expiration du tout. La description peut être trouvée ici .

Comme mentionné par @marceloquinta dans les commentaires, setWriteTimeoutpeut également être défini.

À partir de la version 2.5.0, les valeurs de délai de lecture / écriture / connexion sont définies par défaut sur 10 secondes, comme indiqué par @ChristerNordvik. Cela peut être vu ici .

À partir d'OkHttp3, vous pouvez maintenant le faire via le constructeur comme ceci

client = new OkHttpClient.Builder()
        .connectTimeout(10, TimeUnit.SECONDS)
        .writeTimeout(10, TimeUnit.SECONDS)
        .readTimeout(30, TimeUnit.SECONDS)
        .build();

Vous pouvez également consulter la recette ici .

Miguel Lavigne
la source
6
Existe-t-il un moyen de définir ces délais d'expiration différents pour chaque demande (chaque demande a le même client statique)?
StErMi
3
Vous pouvez définir un délai d'expiration spécifique pour chaque requête: Voici quelques informations: github.com/square/okhttp/wiki/Recipes
Tobliug
3
N'oubliez pas le délai WRITE: client.setWriteTimeout (10, TimeUnit.SECONDS);
marceloquinta
7
@MiguelLavigne Juste pour info, OkHttp a changé dans 2.5.0 pour avoir un délai d'expiration par défaut de 10 sec.
Christer Nordvik
5
Réponse obsolète
devDeejay
143

Pour okhttp3, cela a un peu changé.

Maintenant, vous configurez les heures à l'aide du générateur, et non des setters, comme ceci:

OkHttpClient client = new OkHttpClient.Builder()
        .connectTimeout(10, TimeUnit.SECONDS)
        .writeTimeout(10, TimeUnit.SECONDS)
        .readTimeout(30, TimeUnit.SECONDS)
        .build();

Plus d'informations peuvent être trouvées dans leur wiki: https://github.com/square/okhttp/blob/b3dcb9b1871325248fba917458658628c44ce8a3/docs/recipes.md#timeouts-kt-java

Kaizie
la source
12

Pour le retrofit Retrofit: 2.0.0-beta4, le code est le suivant

OkHttpClient client = new OkHttpClient.Builder()
        .addInterceptor(logging)
        .connectTimeout(30, TimeUnit.SECONDS)
        .readTimeout(30, TimeUnit.SECONDS)
        .writeTimeout(30, TimeUnit.SECONDS)
        .build();

Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("http://api.yourapp.com/")
        .addConverterFactory(GsonConverterFactory.create())
        .client(client)
        .build();
Sam
la source
9

Pour Retrofit 2.0.0-beta1 ou beta2, le code se présente comme suit

    OkHttpClient client = new OkHttpClient();

    client.setConnectTimeout(30, TimeUnit.SECONDS);
    client.setReadTimeout(30, TimeUnit.SECONDS);
    client.setWriteTimeout(30, TimeUnit.SECONDS);

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("http://api.yourapp.com/")
            .addConverterFactory(GsonConverterFactory.create())
            .client(client)
            .build();
xaxiste
la source
7
//add in gradle and sync
compile 'com.squareup.okhttp3:okhttp:3.2.0'
compile 'com.google.code.gson:gson:2.6.2'

import okhttp3.OkHttpClient;
import okhttp3.OkHttpClient.Builder;


Builder b = new Builder();
b.readTimeout(200, TimeUnit.MILLISECONDS);
b.writeTimeout(600, TimeUnit.MILLISECONDS);
// set other properties

OkHttpClient client = b.build();
Mohammad Nabil
la source
5

Cela a changé maintenant. Remplacer .Builder()par.newBuilder()

À partir de okhttp: 3.9.0, le code se présente comme suit:

OkHttpClient okHttpClient = new OkHttpClient()
    .newBuilder()
    .connectTimeout(10,TimeUnit.SECONDS)
    .writeTimeout(10,TimeUnit.SECONDS)
    .readTimeout(30,TimeUnit.SECONDS)
    .build();
Leo
la source
5

okhttp version: 3.11.0ou supérieure

à partir du code source okhttp

/**
 * Sets the default connect timeout for new connections. A value of 0 means no timeout,
 * otherwise values must be between 1 and {@link Integer#MAX_VALUE} when converted to
 * milliseconds.
 *
 * <p>The connectTimeout is applied when connecting a TCP socket to the target host.
 * The default value is 10 seconds.
 */
public Builder connectTimeout(long timeout, TimeUnit unit) {
  connectTimeout = checkDuration("timeout", timeout, unit);
  return this;
}

unit peut être n'importe quelle valeur ci-dessous

TimeUnit.NANOSECONDS
TimeUnit.MICROSECONDS
TimeUnit.MILLISECONDS
TimeUnit.SECONDS
TimeUnit.MINUTES
TimeUnit.HOURS
TimeUnit.DAYS

code d'exemple

OkHttpClient client = new OkHttpClient.Builder()
        .connectTimeout(5000, TimeUnit.MILLISECONDS)/*timeout: 5 seconds*/
        .build();

String url = "https://www.google.com";
Request request = new Request.Builder()
        .url(url)
        .build();

try {
    Response response = client.newCall(request).execute();
} catch (IOException e) {
    e.printStackTrace();
}

Actualisé

J'ai ajouté une nouvelle API à okhttp à partir de la version 3.12.0, vous pouvez définir le délai d'expiration comme ceci:

OkHttpClient client = new OkHttpClient.Builder()
        .connectTimeout(Duration.ofSeconds(5))/*timeout: 5 seconds*/
        .build();

REMARQUE: cela nécessite l'API 26+, donc si vous prenez en charge les anciennes versions d'Android, continuez à l'utiliser (5, TimeUnit.SECONDS).

shellhub
la source
4

ainsi:

//New Request
        HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
        logging.setLevel(HttpLoggingInterceptor.Level.BASIC);
        final OkHttpClient client = new OkHttpClient.Builder()
                .addInterceptor(logging)
                .connectTimeout(30, TimeUnit.SECONDS)
                .readTimeout(30, TimeUnit.SECONDS)
                .writeTimeout(30, TimeUnit.SECONDS)
                .build();
Joolah
la source
4

cela a fonctionné pour moi ... de https://github.com/square/okhttp/issues/3553

OkHttpClient client = new OkHttpClient.Builder()
        .connectTimeout(10, TimeUnit.SECONDS)
        .readTimeout(10, TimeUnit.SECONDS)
        .writeTimeout(10, TimeUnit.SECONDS)
        .retryOnConnectionFailure(false) <-- not necessary but useful!
        .build();
rHenderson
la source
2

Si vous souhaitez personnaliser la configuration, utilisez d'abord la méthodologie ci-dessous pour créer OKhttpclient, puis ajoutez un générateur par-dessus.

private final OkHttpClient client = new OkHttpClient();

// Copy to customize OkHttp for this request.
    OkHttpClient client1 = client.newBuilder()
        .readTimeout(500, TimeUnit.MILLISECONDS)
        .build();
    try (Response response = client1.newCall(request).execute()) {
      System.out.println("Response 1 succeeded: " + response);
    } catch (IOException e) {
      System.out.println("Response 1 failed: " + e);
    }
sandhya murugesan
la source
1

Vous pouvez définir un délai d'expiration d'appel pour couvrir tout le cycle de résolution DNS, connexion, écriture du corps de la requête, traitement du serveur et lecture du corps de la réponse.

val client = OkHttpClient().newBuilder().callTimeout(CALL_TIMEOUT_IN_MINUTES, TimeUnit.MINUTES).build()
ChaturaM
la source