-
-
Save JakeWharton/5616899 to your computer and use it in GitHub Desktop.
import com.android.volley.toolbox.HurlStack; | |
import com.squareup.okhttp.OkHttpClient; | |
import java.io.IOException; | |
import java.net.HttpURLConnection; | |
import java.net.URL; | |
/** | |
* An {@link com.android.volley.toolbox.HttpStack HttpStack} implementation which | |
* uses OkHttp as its transport. | |
*/ | |
public class OkHttpStack extends HurlStack { | |
private final OkHttpClient client; | |
public OkHttpStack() { | |
this(new OkHttpClient()); | |
} | |
public OkHttpStack(OkHttpClient client) { | |
if (client == null) { | |
throw new NullPointerException("Client must not be null."); | |
} | |
this.client = client; | |
} | |
@Override protected HttpURLConnection createConnection(URL url) throws IOException { | |
return client.open(url); | |
} | |
} |
@tasomaniac Update Volley from HEAD; they've since re-added the PATCH request method.
@tasomaniac that ProtocolException is being thrown by base HttpUrlConnection class which doesn't support PATCH in its getRequestMethod() (the list of the supported Methods is in a private array)
You should check out https://github.com/adriancole/retrofit/commit/e704b800878b2e37f5ac98b0139cb4994618ace0 for a reflection based work around and include similar calls in your HurlStack implementation
@JakeWharton: Is it possible to use HTTPS request with OKHttpClient in conjunction with Volley Library.
@JakeWharton: Is it possible to use HTTPS request with OKHttpClient in conjunction with Volley Library.
i found the same issue. i could not user Https request with OKHttpClient in conjunction with Volley Library.
@JakeWharton: How to use OkHttp 2.0 with Volley ? The "open" method was dismissed.
it seems to need com.squareup.okhttp.OkUrlFactory.java, and change the createConnection(URL url) like this:
@OverRide protected HttpURLConnection createConnection(URL url) throws IOException {
return new OkUrlFactory(client).open(url);
}
maybe differences of new version.
I made a new class because I want to use cache from okhttp, not volley.
(Volley does not support syncronous request)
And this is for okhttp 2.0
How can I use Volley and OkHttp 2.0 to accept my self signed Certificate? I am begggining to use OkHttp 2.0 alone inside an Async Task and no problems, but I don't know how to make it work with Volley....Anybody knows?
With the most recent OkHttp I had to change to:
import com.android.volley.toolbox.HurlStack;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.OkUrlFactory;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
/**
* An {@link com.android.volley.toolbox.HttpStack HttpStack} implementation which
* uses OkHttp as its transport.
*/
public class OkHttpStack extends HurlStack {
private final OkUrlFactory mFactory;
public OkHttpStack() {
this(new OkHttpClient());
}
public OkHttpStack(OkHttpClient client) {
if (client == null) {
throw new NullPointerException("Client must not be null.");
}
mFactory = new OkUrlFactory(client);
}
@Override protected HttpURLConnection createConnection(URL url) throws IOException {
return mFactory.open(url);
}
}
Since open
was relocated to the OkUrlFactory
(which is part of okhttp-urlconnection)
@imminent , it's nice you have implement OkHttp With Volley but i want to know how to use this Custom OkHttpStack class that you have implement ? (i am Newbie)
how can i get the jar file with this file added in?
To get @imminent's code to work, you need to add
compile 'com.squareup.okhttp:okhttp-urlconnection:1.6.+'
to your build.gradle
Does it make sense? (In order to avoid "OkHttp changes the global SSL context, breaks other HTTP clients" square/okhttp#184 )
/**
* An {@link com.android.volley.toolbox.HttpStack HttpStack} implementation which
* uses OkHttp as its transport.
*/
public class OkHttpStack extends HurlStack {
private final OkUrlFactory mFactory;
public OkHttpStack() {
this(new OkHttpClient());
}
public OkHttpStack(OkHttpClient client) {
if (client == null) {
throw new NullPointerException("Client must not be null.");
}
try {
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, null, null);
client.setSslSocketFactory(sslContext.getSocketFactory());
} catch (Exception e) {
throw new AssertionError(); // The system has no TLS. Just give up.
}
mFactory = new OkUrlFactory(client);
}
@Override
protected HttpURLConnection createConnection(URL url) throws IOException {
return mFactory.open(url);
}
}
Neither OkHttpClient nor OkUrlFactory has a method named open now. None of the above implementations work with the latest versions of OkHttpClient.
@mehmet6parmak
You need to add okhttp-urlconnection
https://repo1.maven.org/maven2/com/squareup/okhttp/okhttp-urlconnection/2.2.0/
I am sorry guys, but how do I add the url connection you mentioned? I am using the latest Android Studio IDE.
I guess I should explain what I am trying to do:
- All I am trying to do is to be able to us PATCH to send data over to a server. I haven't been able to do that with Volley for the past 2 days... and I am pretty much hitting my head into the wall right now :(
I followed previous comments on how to use OkHttpStack implementation. I did all that but I am getting this error when I run my app in the emulator:
java.net.ProtocolException: Unknown method 'PATCH'; must be one of [OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE]
which is something that one other person got too. However, I don't understand how to solve this problem.
Can you please help?
Thanks
This implementation of OkHttpStack works with OkHttpClient v2.3.0 (doesn't use open(url) method):
https://gist.github.com/bryanstern/4e8f1cb5a8e14c202750
@imminent version still works with these dependencies in gradle:
compile 'com.squareup.okhttp:okhttp:2.4.0'
compile 'com.squareup.okhttp:okhttp-urlconnection:2.4.0'
then you just have to init your RequestQueue with:
myRequestQueue = Volley.newRequestQueue(context, new OkHttpStack())
@JakeWharton i' m your fan!!
Any update on how we can use Volley with okhttp3 ?
Any update on how we can use Volley with okhttp3 ?
Yep! you can look here : https://gist.github.com/SylvainHocq/36d6b17e53c7004f6ae59e689ec0862f
client.open(url);
open method is not working,
Is there any working alternative for this?.
@sushant4anshu, yes,
That one works for me
add these libraries to gradle file
compile 'com.squareup.okhttp3:okhttp:3.9.0'
compile 'com.squareup.okhttp:okhttp-urlconnection:1.6.+'
then :
/**
* An {@link com.android.volley.toolbox.HttpStack HttpStack} implementation which
* uses OkHttp as its transport.
*/
private class OkHttpStack extends HurlStack {
private final OkUrlFactory mFactory;
public OkHttpStack() {
this(new OkHttpClient());
}
public OkHttpStack(OkHttpClient client) {
if (client == null) {
throw new NullPointerException("Client must not be null.");
}
mFactory = new OkUrlFactory(client);
}
@Override protected HttpURLConnection createConnection(URL url) throws IOException {
return mFactory.open(url);
}
}
while creating Volley Queue:
mRequestQueue = Volley.newRequestQueue(mCtx.getApplicationContext(), new OkHttpStack());
What is the advantage of using OkHttp
as transport for Volley
?
OkUrlFactory is gone
It was deprecated in December 2015 and deleted in March 2019. You should use this instead:
https://gist.github.com/bryanstern/4e8f1cb5a8e14c202750
thank you guys for the insight, here the updated version using volley 1.2.1 (latest) https://gist.github.com/4sskick/d1318379500747564d8f1c8d6af1f796 in case still you guys still has old project which need to maintain but don't want to refactor to OkHttp or another request library
I am getting "Unknown method 'PATCH'; must be one of [OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE]" when using Volley with OKHttp. What do I do? I have tried everything.