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)