Android
OkHttp
Sök…
Loggar interceptor
Interceptors
används för att avlyssna OkHttp
samtal. Anledningen till att avlyssna kan vara att övervaka, skriva om och skriva om samtal igen. Det kan användas för utgående förfrågan eller inkommande svar båda.
class LoggingInterceptor implements Interceptor {
@Override public Response intercept(Interceptor.Chain chain) throws IOException {
Request request = chain.request();
long t1 = System.nanoTime();
logger.info(String.format("Sending request %s on %s%n%s",
request.url(), chain.connection(), request.headers()));
Response response = chain.proceed(request);
long t2 = System.nanoTime();
logger.info(String.format("Received response for %s in %.1fms%n%s",
response.request().url(), (t2 - t1) / 1e6d, response.headers()));
return response;
}
}
Omskrivning av svar
private static final Interceptor REWRITE_CACHE_CONTROL_INTERCEPTOR = new Interceptor() {
@Override public Response intercept(Interceptor.Chain chain) throws IOException {
Response originalResponse = chain.proceed(chain.request());
return originalResponse.newBuilder()
.header("Cache-Control", "max-age=60")
.build();
}
};
Grundläggande användningsexempel
Jag gillar att OkHttp
min OkHttp
till exempel i en klass som heter HttpClient
, och i den här klassen har jag metoder för var och en av de viktigaste HTTP-verben, post
, get
, put
och delete
, vanligtvis. (Jag har vanligtvis ett gränssnitt för att behålla det att implementera, för att enkelt kunna ändra till en annan implementering, om så behövs):
public class HttpClient implements HttpClientInterface{
private static final String TAG = OkHttpClient.class.getSimpleName();
public static final MediaType JSON
= MediaType.parse("application/json; charset=utf-8");
OkHttpClient httpClient = new OkHttpClient();
@Override
public String post(String url, String json) throws IOException {
Log.i(TAG, "Sending a post request with body:\n" + json + "\n to URL: " + url);
RequestBody body = RequestBody.create(JSON, json);
Request request = new Request.Builder()
.url(url)
.post(body)
.build();
Response response = httpClient.newCall(request).execute();
return response.body().string();
}
Syntaxen är densamma för put
, get
och delete
undantag för 1 ord ( .put(body)
) så det kan vara motbjudande att publicera den koden också. Användningen är ganska enkel, bara ringa lämplig metod på någon url
med viss json
nyttolast och metoden kommer att returnera en sträng som ett resultat som du senare kan använda och analysera. Låt oss anta att svaret kommer att vara en json
, vi kan enkelt skapa ett JSONObject
från det:
String response = httpClient.post(MY_URL, JSON_PAYLOAD);
JSONObject json = new JSONObject(response);
// continue to parse the response according to it's structure
Synkrona Hämta samtal
private final OkHttpClient client = new OkHttpClient();
public void run() throws Exception {
Request request = new Request.Builder()
.url(yourUrl)
.build();
Response response = client.newCall(request).execute();
if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
Headers responseHeaders = response.headers();
System.out.println(response.body().string());
}
Asynkron Hämta samtal
private final OkHttpClient client = new OkHttpClient();
public void run() throws Exception {
Request request = new Request.Builder()
.url(yourUrl)
.build();
client.newCall(request).enqueue(new Callback() {
@Override public void onFailure(Call call, IOException e) {
e.printStackTrace();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
Headers responseHeaders = response.headers();
System.out.println(response.body().string());
}
});
}
Posteringsformulärparametrar
private final OkHttpClient client = new OkHttpClient();
public void run() throws Exception {
RequestBody formBody = new FormBody.Builder()
.add("search", "Jurassic Park")
.build();
Request request = new Request.Builder()
.url("https://en.wikipedia.org/w/index.php")
.post(formBody)
.build();
Response response = client.newCall(request).execute();
if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
System.out.println(response.body().string());
}
Lägg upp en multipartförfrågan
private static final String IMGUR_CLIENT_ID = "...";
private static final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png");
private final OkHttpClient client = new OkHttpClient();
public void run() throws Exception {
// Use the imgur image upload API as documented at https://api.imgur.com/endpoints/image
RequestBody requestBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("title", "Square Logo")
.addFormDataPart("image", "logo-square.png",
RequestBody.create(MEDIA_TYPE_PNG, new File("website/static/logo-square.png")))
.build();
Request request = new Request.Builder()
.header("Authorization", "Client-ID " + IMGUR_CLIENT_ID)
.url("https://api.imgur.com/3/image")
.post(requestBody)
.build();
Response response = client.newCall(request).execute();
if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
System.out.println(response.body().string());
}
Ställa in OkHttp
Ta tag via Maven:
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>3.6.0</version>
</dependency>
eller Gradle:
compile 'com.squareup.okhttp3:okhttp:3.6.0'