Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
A `HttpStack` implementation for Volley that uses OkHttp as its transport.
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);
}
}
Owner

Use Volley.newRequestQueue(context, new OkHttpStack()) as of http://r.android.com/59170

Perfect! Was waiting for something like this since Google I/O 2k13 about Volley.

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.

@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 adriancole/retrofit@e704b80 for a reflection based work around and include similar calls in your HurlStack implementation

laaptu commented May 2, 2014

@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.

s1rius commented May 27, 2014

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

@JakeWharton @s1rius

maybe differences of new version.

ceram1 commented Jun 16, 2014

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

https://gist.github.com/ceram1/8254f7a68d81172c1669

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?

imminent commented Jul 7, 2014

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

hpadrao commented Nov 27, 2014

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.

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

vfede commented Jul 2, 2015

@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!!

astuter commented Sep 9, 2016

Any update on how we can use Volley with okhttp3 ?

Anawaz commented Sep 10, 2016

Any update on how we can use Volley with okhttp3 ?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment