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.

Morteza Rastgoo
quelle
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);
    }
Morteza Rastgoo
quelle
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();
    }
Gaurang
quelle
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();
Chebaby
quelle
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!

Rajesh
quelle
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)
    }
}
Alex Nolasco
quelle
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();
Kushagar Lall
quelle
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");
    }
}));
MingalevME
quelle
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();
Pankaj Sharma
quelle
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()
}
patrick-fitzgerald
quelle