web-dev-qa-db-fra.com

Comment définir le délai de connexion avec OkHttp

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

OkHttpClient client = new OkHttpClient();

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

Response response = client.newCall(request).execute();
152
kelvincer

Tu dois simplement faire ça

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 la valeur définie dans setReadTimeout est celle utilisée dans setSoTimeout sur Socket en interne dans la classe OkHttpConnection .

Ne pas définir de délai d'expiration sur OkHttpClient équivaut à définir une valeur de 0 sur setConnectTimeout ou setReadTimeout et n'entraînera aucun délai d'expiration. La description peut être trouvée ici .

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

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

À partir de OkHttp3 peut maintenant le faire via le Builder comme

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

Vous pouvez également voir la recette ici .

294
Miguel Lavigne

Pour okhttp3 cela a un peu changé.

Maintenant, vous configurez les temps à l'aide du constructeur, 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/master/RECIPES.md#timeouts

124
Kaizie

Pour la modification ultérieure: 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();
11
Sam

Pour Retrofit 2.0.0-beta1 ou beta2, le code est le suivant

    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();
9
xaxist
//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();
7
Mohammad nabil

C'est changé maintenant. Remplacez .Builder() par .newBuilder()

A partir de okhttp: 3.9. 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();
5
Leo

okhttp version: 3.11.0 ou supérieur

depuis le 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

exemple de code

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();
}

Mis à jour

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

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

NOTE: Cela nécessite l'API 26+. Par conséquent, si vous prenez en charge les anciennes versions d'Android, continuez d'utiliser (5, TimeUnit.SECONDS).

4
shellhub

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

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

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();
4
Joolah

Si vous souhaitez personnaliser la configuration, utilisez d'abord la méthode 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);
    }
2

Vous pouvez définir un délai d’appel couvrant tout le cycle de la résolution du DNS, de la connexion, de l’écriture du corps de la demande, du traitement du serveur et de la lecture du corps de la réponse.

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