Wie füge ich dem OkHttp Request Interceptor Header hinzu?


89

Ich habe diesen Interceptor, den ich meinem OkHttp-Client hinzufüge:

public class RequestTokenInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
  Request request = chain.request();
  // Here where we'll try to refresh token.
  // with an retrofit call
  // After we succeed we'll proceed our request
  Response response = chain.proceed(request);
  return response;
}
}

Wie kann ich Header hinzufügen, um sie in meinem Interceptor anzufordern?

Ich habe es versucht, aber ich mache einen Fehler und ich verliere meine Anfrage beim Erstellen einer neuen Anfrage:

    public class RequestTokenInterceptor implements Interceptor {
    @Override
    public Response intercept(Interceptor.Chain chain) throws IOException {
        Request request = chain.request();
        Request newRequest;

        try {
            Log.d("addHeader", "Before");
            String token = TokenProvider.getInstance(mContext).getToken();
            newRequest = request.newBuilder()
                    .addHeader(HeadersContract.HEADER_AUTHONRIZATION, O_AUTH_AUTHENTICATION + token)
                    .addHeader(HeadersContract.HEADER_CLIENT_ID, CLIENT_ID)
                    .build();
        } catch (Exception e) {
            Log.d("addHeader", "Error");
            e.printStackTrace();
            return chain.proceed(request);
        }

        Log.d("addHeader", "after");
        return chain.proceed(newRequest);
    }
}

Beachten Sie, dass ich weiß, dass ich beim Erstellen einer Anfrage wie folgt einen Header hinzufügen kann:

Request request = new Request.Builder()
    .url("https://api.github.com/repos/square/okhttp/issues")
    .header("User-Agent", "OkHttp Headers.java")
    .addHeader("Accept", "application/json; q=0.5")
    .addHeader("Accept", "application/vnd.github.v3+json")
    .build();

Aber es passt nicht zu meinen Bedürfnissen. Ich brauche es in Abfangjäger.


1
Ihr Abfangjäger sieht richtig aus. Was funktioniert nicht damit?
Jesse Wilson

Antworten:


152

Schließlich habe ich die Überschriften folgendermaßen hinzugefügt:

@Override
    public Response intercept(Interceptor.Chain chain) throws IOException {
        Request request = chain.request();
        Request newRequest;

        newRequest = request.newBuilder()
                .addHeader(HeadersContract.HEADER_AUTHONRIZATION, O_AUTH_AUTHENTICATION)
                .addHeader(HeadersContract.HEADER_X_CLIENT_ID, CLIENT_ID)
                .build();
        return chain.proceed(newRequest);
    }

1
Aus irgendeinem Grund werden die Header nicht zu meiner Anfrage hinzugefügt?! Ich verwende okHttp.Builder und networkInterceptors (). Add (Interceptor) mit demselben Code wie in dieser Antwort, aber die Header werden nicht hinzugefügt.
Informatic0re

Wie füge ich einen Header für eine YouTube-Anfrage hinzu? Ist es ein Paketname und Ihr API-Schlüssel und dann durchlaufen.addheader(params1, params2);
RoCk RoCk

@RoCk Sie können separate RestClients mit unterschiedlicher Header-Konfiguration haben.
Morteza Rastgoo

25

Sie können es auf diese Weise tun

private String GET(String url, Map<String, String> header) throws IOException {
        Headers headerbuild = Headers.of(header);
        Request request = new Request.Builder().url(url).headers(headerbuild).
                        build();

        Response response = client.newCall(request).execute();
        return response.body().string();
    }

5
Dies ist kein Abfangjäger.
bekce

14

Hier ist eine nützliche Zusammenfassung von lfmingo

OkHttpClient.Builder httpClient = new OkHttpClient.Builder();

httpClient.addInterceptor(new Interceptor() {

    @Override
    public Response intercept(Interceptor.Chain chain) throws IOException {
        Request original = chain.request();

        Request request = original.newBuilder()
            .header("User-Agent", "Your-App-Name")
            .header("Accept", "application/vnd.yourapi.v1.full+json")
            .method(original.method(), original.body())
            .build();

        return chain.proceed(request);
    }
}

OkHttpClient client = httpClient.build();

Retrofit retrofit = new Retrofit.Builder()  
    .baseUrl(API_BASE_URL)
    .addConverterFactory(GsonConverterFactory.create())
    .client(client)
    .build();

10

Wenn Sie die Retrofit-Bibliothek verwenden, können Sie den Header @Headerohne Verwendung von Interceptor mithilfe von Anmerkungen direkt an die API-Anforderung übergeben . Das folgende Beispiel zeigt, wie Sie der Retrofit-API-Anforderung einen Header hinzufügen.

@POST(apiURL)
void methodName(
        @Header(HeadersContract.HEADER_AUTHONRIZATION) String token,
        @Header(HeadersContract.HEADER_CLIENT_ID) String token,
        @Body TypedInput body,
        Callback<String> callback);

Ich hoffe es hilft!


4
Ich weiß das, aber ich habe eine Methode, um das Token mit dem Namen zu erhalten: getToken (), das auf Thread wartet. Wenn ich das in OkHttp Interceptor nenne, läuft es im Nachrüst-Thread und ich muss mich nicht um Thread-Probleme kümmern.
Morteza Rastgoo

9

Diese Kotlin-Klasse hatte ähnliche Probleme mit anderen Beispielen und arbeitete für mich

import okhttp3.Interceptor
import okhttp3.Response

class CustomInterceptor : Interceptor {
    override fun intercept(chain: Interceptor.Chain) : Response {               
        val request = chain.request().newBuilder()
            .header("x-custom-header", "my-value")
            .build()
        return chain.proceed(request)
    }
}

6

Es gibt noch eine andere Möglichkeit, Interceptors in Ihrem OkHttp3 hinzuzufügen (neueste Version ab sofort), nämlich das Hinzufügen der Interceptors zu Ihrem Okhttp-Builder

okhttpBuilder.networkInterceptors().add(chain -> {
 //todo add headers etc to your AuthorisedRequest

  return chain.proceed(yourAuthorisedRequest);
});

und schließlich erstellen Sie Ihren okHttpClient aus diesem Builder

OkHttpClient client = builder.build();

Ja, ich habe den Teil nicht bemerkt, add*Network*Interceptoranstatt addInterceptormich ein paar Stunden lang an den Haaren ziehen zu lassen :)
Antek

0
package com.example.network.interceptors;

import androidx.annotation.NonNull;

import java.io.IOException;
import java.util.Map;

import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.Response;

public class RequestHeadersNetworkInterceptor implements Interceptor {

    private final Map<String, String> headers;

    public RequestHeadersNetworkInterceptor(@NonNull Map<String, String> headers) {
        this.headers = headers;
    }

    @NonNull
    @Override
    public Response intercept(Chain chain) throws IOException {
        Request.Builder builder = chain.request().newBuilder();
        for (Map.Entry<String, String> header : headers.entrySet()) {
            if (header.getKey() == null || header.getKey().trim().isEmpty()) {
                continue;
            }
            if (header.getValue() == null || header.getValue().trim().isEmpty()) {
                builder.removeHeader(header.getKey());
            } else {
                builder.header(header.getKey(), header.getValue());
            }
        }
        return chain.proceed(builder.build());
    }

}

Anwendungsbeispiel:

httpClientBuilder.networkInterceptors().add(new RequestHeadersNetworkInterceptor(new HashMap<String, String>()
{
    {
        put("User-Agent", getUserAgent());
        put("Accept", "application/json");
    }
}));

0
client = new OkHttpClient();

        Request request = new Request.Builder().header("authorization", token).url(url).build();
        MyWebSocketListener wsListener = new MyWebSocketListener(LudoRoomActivity.this);
        client.newWebSocket(request, wsListener);
        client.dispatcher().executorService().shutdown();

0

Das hat bei mir funktioniert:

class JSONHeaderInterceptor : Interceptor {
    override fun intercept(chain: Interceptor.Chain) : Response {
        val request = chain.request().newBuilder()
            .header("Content-Type", "application/json")
            .build()
        return chain.proceed(request)
    }
}
fun provideHttpClient(): OkHttpClient {
    val okHttpClientBuilder = OkHttpClient.Builder()
    okHttpClientBuilder.addInterceptor(JSONHeaderInterceptor())
    return okHttpClientBuilder.build()
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.