okhttp
An HTTP+SPDY client for Android and Java applications.
OkHttp an http & spdy client for android and java applications
I use retrofit and okhttp in one of our applications.
I can't really find a good explanation for the default behaviour of Retrofit.
If Okhttp is on the class path it will be automatically used. But as far as I can see it the default HttpResponseCache is null.
Do I need to explicitly enable caching with Retrofit and Okhttp?
Source: (StackOverflow)
Using OkHttp by Square https://github.com/square/okhttp, how can I:
- Retrieve a cookie returned from the server
- Store the cookie for upcoming requests
- Use the stored cookie in subsequent requests
- Update the cookie returned by the subsequent request
Ideally the cookie would be stored, resent and updated automatically with every request.
Source: (StackOverflow)
In Android, I'd like to use the new OkHttp 2.0 to request some URLs, but I'd like more control over redirects. I've already found the option to enable or disable following HTTPS → HTTP or HTTP → HTTPS redirects, but I'd like to not follow any redirects, so I can update my GUI as soon as possible, and choose whether to follow them from application logic. I don't see an option to do this. Is it possible, and if so, how can I achieve this?
Source: (StackOverflow)
I am developing app using OkHttp library and my trouble is I cannot find how to set connection timeout and socket timeout.
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url(url).build();
Response response = client.newCall(request).execute();
Thanks.
Source: (StackOverflow)
Could not find method com.squareup.okhttp.OkHttpClient.open, referenced from method retrofit.client.OkClient.openConnection.
below is my gradle config
compile 'com.squareup.okhttp:okhttp:+'
compile 'com.squareup.okhttp:okhttp-urlconnection:+'
compile 'com.squareup.retrofit:retrofit:+'
Source: (StackOverflow)
Using Retrofit 1.6.0, OkHTTP 2.0.0, and OkHTTP-UrlConnection 2.0.0.
I am doing a POST to a service using Retrofit to a URL that does not exist. The failure callback is called, as expected. However, the RetrofitError parameter does not have a response. I would really like to grab the HTTP status code that was returned by using
error.getResponse().getStatus()
but since getResponse() returns null, I can't.
Why is getResponse() null and how can I get the status?
Thanks.
Also, the error I am receiving is UnknownHostException, as expected. Repeat: I am expecting this error. I want to know how to get the HTTP status code or why error.getResponse() returns null.
Edit: Here's some code:
RestAdapterBuilderClass.java
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint("http://badURL.DoesntMatter/");
.setRequestInterceptor(sRequestInterceptor)
.setLogLevel(RestAdapter.LogLevel.FULL)
.build();
sService = restAdapter.create(ServiceInterface.class);
ServiceInterface.java
@POST("/Login")
void login(@Body JsonObject body, Callback<String> callback);
CallbackClass.java
@Override
public void failure(RetrofitError error) {
if (error.getResponse() == null) {
// error.getResponse() is null when I need to get the status code
// from it.
return;
}
}
Source: (StackOverflow)
I'm using an interceptor, and I would like to log the body of a request I'm making but I can't see any way of doing this.
Is it possible ?
public class LoggingInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
long t1 = System.nanoTime();
Response response = chain.proceed(request);
long t2 = System.nanoTime();
double time = (t2 - t1) / 1e6d;
if (request.method().equals("GET")) {
Logs.info(String.format("GET " + F_REQUEST_WITHOUT_BODY + F_RESPONSE_WITH_BODY, request.url(), time, request.headers(), response.code(), response.headers(), response.body().charStream()));
} else if (request.method().equals("POST")) {
Logs.info(String.format("POST " + F_REQUEST_WITH_BODY + F_RESPONSE_WITH_BODY, request.url(), time, request.headers(), request.body(), response.code(), response.headers(), response.body().charStream()));
} else if (request.method().equals("PUT")) {
Logs.info(String.format("PUT " + F_REQUEST_WITH_BODY + F_RESPONSE_WITH_BODY, request.url(), time, request.headers(), request.body().toString(), response.code(), response.headers(), response.body().charStream()));
} else if (request.method().equals("DELETE")) {
Logs.info(String.format("DELETE " + F_REQUEST_WITHOUT_BODY + F_RESPONSE_WITHOUT_BODY, request.url(), time, request.headers(), response.code(), response.headers()));
}
return response;
}
}
and the result :
POST [some url] in 88,7ms
ZoneName: touraine
Source: Android
body: retrofit.client.OkClient$1@1df53f05 <-request.body().toString() gives me this, but I would like the content string
Response: 500
Date: Tue, 24 Feb 2015 10:14:22 GMT
body: [some content]
Source: (StackOverflow)
This is a stack trace I get when running an android app I recently inherited. We're not using okhttp as an explicity dependency, and the com.android.okhttp in the trace makes me think the aosp is using okhttp now internally?
java.lang.Throwable: Explicit termination method 'close' not called
E at dalvik.system.CloseGuard.open(CloseGuard.java:184)
E at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:278)
E at com.android.okhttp.Connection.upgradeToTls(Connection.java:146)
E at com.android.okhttp.Connection.connect(Connection.java:107)
E at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:294)
E at com.android.okhttp.internal.http.HttpEngine.sendSocketRequest(HttpEngine.java:255)
E at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:206)
E at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:345)
E at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:296)
E at com.android.okhttp.internal.http.HttpURLConnectionImpl.getHeaderField(HttpURLConnectionImpl.java:143)
E at java.net.URLConnection.getHeaderFieldInt(URLConnection.java:544)
E at java.net.URLConnection.getContentLength(URLConnection.java:316)
E at com.android.okhttp.internal.http.HttpsURLConnectionImpl.getContentLength(HttpsURLConnectionImpl.java:18
2)
Source: (StackOverflow)
I am trying to connect to rest service via retrofit in android application. I am getting responses. But when there is some error response from the service, conversion exception occurs and now I want to do some actions based on the response body. But I am getting response body as NULL. But retrofit log has a error message. Why is this happening.
04-14 18:57:35.686: D/Reftofit log(24856): OkHttp-Received-Millis: 1397527055676
04-14 18:57:35.686: D/Reftofit log(24856): OkHttp-Response-Source: NETWORK 200
04-14 18:57:35.686: D/Reftofit log(24856): OkHttp-Sent-Millis: 1397527055492
04-14 18:57:35.686: D/Reftofit log(24856): Server: Apache/2.2.22 (Ubuntu)
04-14 18:57:35.686: D/Reftofit log(24856): X-Powered-By: PHP/5.3.10-1ubuntu3.10
04-14 18:57:35.701: D/Reftofit log(24856): {"result":"Invalid Token ID"}
Code:
public void failure(RetrofitError arg0) {
String response = null;
TokenError r = (TokenError) arg0
.getBodyAs(TokenError.class);
response = r.getErrorDetails();
Log.e(TAG, response);
if (response != null
&& response.contains("Invalid Token ID"))
GroupDataProvider.getInstance().onFailure();
}
};
Here I am getting r as NULL. I don't know why? Do I need to set something with rest adapter so that the response will be passed to retrofit error object.
Source: (StackOverflow)
I am using okhttp 2.0 in my Android app and didn't find a way to set some common User Agent for all outgoing requests.
I thought I could do something like
OkHttpClient client = new OkHttpClient();
client.setDefaultUserAgent(...)
...but there's no such method or similar.
Of course I could provide some extension utility method which would wrap a RequestBuilder to attach .header("UserAgent") and then I would use it for building all my requests, but I thought maybe I missed some existing and simpler way?
Source: (StackOverflow)
OKHttp supports both synchronous and asynchronous api.
If I want to issue an async request, I can:
- Use a AsyncTask, and issue OKhttp synchronous api.
- Issue a OKhttp asynchronous api.
What is the difference between these 2 options? And which one is better?
Source: (StackOverflow)
I'm trying to configure cache with Retrofit 1.9.0 and OkHtttp 2.5.0.
Here is how I provide OkHttpClient for my RestAdapter:
@Provides
@Singleton
public OkHttpClient provideOkHttpClient() {
OkHttpClient okHttpClient = new OkHttpClient();
okHttpClient.setConnectTimeout(TIMEOUT_IN_SECONDS, TimeUnit.SECONDS);
okHttpClient.setReadTimeout(TIMEOUT_IN_SECONDS, TimeUnit.SECONDS);
okHttpClient.setWriteTimeout(TIMEOUT_IN_SECONDS, TimeUnit.SECONDS);
File cacheDir = new File(context.getCacheDir(), "http");
final Cache cache = new Cache(cacheDir, DISK_CACHE_SIZE_IN_BYTES);
okHttpClient.setCache(cache);
okHttpClient.interceptors().add(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Response response = chain.proceed(request);
Response finalResponse = response.newBuilder()
.header("Cache-Control", String.format("public, max-stale=%d", 604800))
.build();
Log.d("OkHttp", finalResponse.toString());
Log.d("OkHttp Headers", finalResponse.headers().toString());
return finalResponse;
}
});
return okHttpClient;
}
I did not forget to setClient on RestAdapter.Builder. Also made sure, that I'm actually using instance of RestAdapter with this client set.
Even checked if the files are created under "http" folder. They are.
However after I turn of WIFI and reload my screen I end up in OnError callback of Observable endpoint with this message:
retrofit.RetrofitError: failed to connect to /10.40.31.12 (port 8888) after 10000ms: connect failed: ENETUNREACH (Network is unreachable)
DISCLAIMER: I should probably mention that the final Observable is combined from 5 others, with flatMap and zip on the way.
Source: (StackOverflow)
I have a problem when i activate gzip on WS using retrofit 1.4.1 and okhttp 1.3.0.
RequestInterceptor requestInterceptor = new RequestInterceptor() {
@Override
public void intercept(RequestFacade request) {
request.addHeader("content-type", "application/json");
request.addHeader("accept-encoding", "gzip"); // Here is the problem
}
};
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint(Constants.HOST)
.setLogLevel(RestAdapter.LogLevel.FULL)
.setRequestInterceptor(requestInterceptor)
.build();
If I comment the following line request.addHeader("accept-encoding", "gzip"); there is no problem but if gzip is activated, i get an error (my request falls in failure).
Here is my logcat with request.addHeader("accept-encoding", "gzip");
1326 Retrofit D : HTTP/1.1 200 OK
1326 Retrofit D Cache-Control: public, max-age=600
1326 Retrofit D Content-Encoding: gzip
1326 Retrofit D Content-Length: 254
1326 Retrofit D Content-Type: application/json
1326 Retrofit D Date: Wed, 05 Feb 2014 20:22:26 GMT
1326 Retrofit D OkHttp-Received-Millis: 1391631746193
1326 Retrofit D OkHttp-Response-Source: NETWORK 200
1326 Retrofit D OkHttp-Selected-Transport: http/1.1
1326 Retrofit D OkHttp-Sent-Millis: 1391631745971
1326 Retrofit D Server: Apache
1326 Retrofit D Vary: Accept-Encoding
1326 Retrofit D X-Powered-By: PHP/5.3.3-7+squeeze18
1326 Retrofit D ������������}�?O�0��~����nHZOH0 �D�ù���?���~w.�:����=�{�
����|A���=�V/~}o�)���&����<�`�6&��ѳ:��5�ke��V�WD�H�
���ud�J5رyp��G�ːg�y�ʴ����Mxq<�#�Rb`Su�@�0��y��lr;�W�2�C3�
T��$���.�
��xѥ���R
y���hmt����R����o����v��7@P�
4Y����
1326 Retrofit D <--- END HTTP (254-byte body)
1326 System.err W retrofit.RetrofitError: retrofit.converter.ConversionException: com.google.gson.JsonSyntaxException: java.lang.Ille
galStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1
1326 System.err W at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:408)
1326 System.err W at retrofit.RestAdapter$RestHandler.access$100(RestAdapter.java:262)
1326 System.err W at retrofit.RestAdapter$RestHandler$2.obtainResponse(RestAdapter.java:313)
1326 System.err W at retrofit.CallbackRunnable.run(CallbackRunnable.java:38)
1326 System.err W at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
1326 System.err W at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
1326 System.err W at retrofit.Platform$Android$2$1.run(Platform.java:136)
1326 System.err W at java.lang.Thread.run(Thread.java:841)
1326 System.err W Caused by: retrofit.converter.ConversionException: com.google.gson.JsonSyntaxException: java.lang.IllegalStateExcep
How can I turn on gzip ?
Thx in advance
Source: (StackOverflow)
I thought that these recent versions were supposed to be compatible. There is this tweet;
https://twitter.com/JakeWharton/status/553066921675857922 and the changelog of Retrofit 1.9 mentions it too.
However when I try this:
OkHttpClient httpClient = new OkHttpClient();
httpClient.interceptors().add(new TokenExpiredInterceptor());
mRestAdapter = new RestAdapter.Builder()
.setEndpoint(API_ENDPOINT)
.setClient(httpClient)
.setLogLevel(BuildConfig.DEBUG ?
RestAdapter.LogLevel.FULL :
RestAdapter.LogLevel.NONE)
.setRequestInterceptor(new AuthorizationInterceptor())
.build();
It still doesn't work. The setClient method complains about an incompatible Client object;
Error:(29, 21) error: no suitable method found for setClient(OkHttpClient)
method Builder.setClient(Client) is not applicable
(argument mismatch; OkHttpClient cannot be converted to Client)
method Builder.setClient(Provider) is not applicable
(argument mismatch; OkHttpClient cannot be converted to Provider)
What am I missing? I also see OkHttpClient does not implement the Client interface.
I am using this approach for now; https://medium.com/@nullthemall/execute-retrofit-requests-directly-on-okhttp-2-2-7e919d87b64e
Did I misinterpret the changelog? Maye Retrofit 1.9 can uses OkHttpClient 2.2 when it's in the classpath but the interface isn't adapted yet?
Source: (StackOverflow)
I am using retrofit in my application like this
final OkHttpClient okHttpClient = new OkHttpClient();
okHttpClient.interceptors().add(new YourInterceptor());
final OkClient okClient = new OkClient(okHttpClient);
Builder restAdapterBuilder = new RestAdapter.Builder();
restAdapterBuilder.setClient(okClient).setLogLevel(LogLevel.FULL)
.setEndpoint("some url");
final RestAdapter restAdapter = restAdapterBuilder.build();
public class YourInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
// TODO Auto-generated method stub
Request request = chain.request();
if (request != null) {
Request.Builder signedRequestBuilder = request.newBuilder();
signedRequestBuilder.tag("taggiventorequest");
request = signedRequestBuilder.build();
request.tag();
}
return chain.proceed(request);
}
}
after sending request i am calling
okHttpClient.cancel("taggiventorequest");
but request is not cancelling i am getting the response from retrofit
dont know why it is not cancelling my request
I need volley like cancelation retrofit
Source: (StackOverflow)