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();
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 OkHttp
Connection
.
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 .
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
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();
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();
//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();
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();
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();
}
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)
.
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();
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();
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);
}
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()