pr Rost
pr Rost

Reputation: 127

How to add authorization in my request header?

I need to add Authorization Header to my request,that must look like this:

"Authorization: Basic Zm9vOmJhcg=="

I have value of my username and password, how can I add this to request in Retrofit 2? This looked very simple,but I dont know where I can initialize this header in my Fragment?

my Fragment class:

public class FeedFragment extends Fragment {
    EditText username;
    EditText password;
    Button btnLogin;

    public List<SignInResult> signInResult;
    String username_value,password_value;
    public static final String ROOT_URL = "https://api.vid.me/";

    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_feed, container, false);
        username = (EditText) rootView.findViewById(R.id.user_name_field);
        password = (EditText) rootView.findViewById(R.id.password_field);
        btnLogin = (Button) rootView.findViewById(R.id.button_login);
        btnLogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Authorize();
            }
        });
        return rootView;
    }

    public void Authorize() {
        Retrofit retrofitAdapter = new Retrofit.Builder()
                .addConverterFactory(GsonConverterFactory.create())
                .baseUrl(ROOT_URL)
                .build();
        final VideoApi videoApi = retrofitAdapter.create(VideoApi.class);

         username_value = username.getText().toString();
         password_value = password.getText().toString();

        Call<SignInResults> call = videoApi.insertUser(username_value,password_value);
        call.enqueue(new Callback<SignInResults>() {


            @Override
            public void onResponse(Call<SignInResults> call, Response<SignInResults> response) {
                SignInResults results = response.body();
                Log.d("Response ==>> ", new GsonBuilder().setPrettyPrinting().create().toJson(results));

            }

            @Override
            public void onFailure(Call<SignInResults> call, Throwable t) {

            }
        });
    }
}

my API interface:

public interface VideoApi {

    @GET("/videos/featured")
    Call<Videos> getFeaturedVideo();

    @GET("/videos/new")
    Call<Videos> getNewVideo();

@Headers("Content-Type:application/x-www-form-urlencoded")
    @FormUrlEncoded
    @POST("/auth/create")
   Call<SignInResults>insertUser(@Field("email") String username,
      @Field("password") String password
   );
}

Upvotes: 1

Views: 1917

Answers (1)

Nagarjun
Nagarjun

Reputation: 2476

Two ways you can do it depending on the usecase.

First way: Add interceptor to your request using okhttp client

final String myToken = "Zm9vOmJhcg==";
Interceptor interceptor = new Interceptor() {
  @Override
  public okhttp3.Response intercept(Chain chain) throws IOException {
    Request newRequest = chain.request().newBuilder()
       .addHeader("Authorization", "Basic " + yourtoken).build();
    return chain.proceed(newRequest);
  }
};

OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.interceptors().add(interceptor);
OkHttpClient client = builder.build();

Now change your retrofit call.

Retrofit retrofitAdapter = new Retrofit.Builder()
     .addConverterFactory(GsonConverterFactory.create())
     .baseUrl(ROOT_URL)
     .client(client)
     .build();

Second Way: Add header to your API call

Call<SignInResults>insertUser(
      @Header("Authorization") String token,
      @Field("email") String username,
      @Field("password") String password
   );

Upvotes: 2

Related Questions