Retrofit + 基本认证

6

我已经使用基础认证实现了Retrofit,我在登录请求中发送了@header,但是当我调用一些受授权的请求时,它返回401(未授权)。

如何通用地实现它?还是我总是需要在我的授权请求中调用@header?

@GET("user")
Call<User> getUserByEmail(@Query("email") String email, @Header("Authorization") String authorization);

当我调用“按电子邮件获取用户”时(我对用户进行身份验证)...
@PUT("usuario/{userId}/")
Call<User> putUserById(@Path("userId") Integer id, @Body User user);

当我调用Put user(我需要进行身份验证的请求)时。

我的Retrofit类...

public class NetworkService {
private NetworkAPI networkAPI;
private OkHttpClient okHttpClient;

public NetworkService() {
    okHttpClient = buildClient();
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(BuildConfig.HOST)
            .addConverterFactory(GsonConverterFactory.create())
            .client(okHttpClient)
            .build();

    networkAPI = retrofit.create(NetworkAPI.class);
}

public NetworkAPI getAPI() {
    return networkAPI;
}

private OkHttpClient buildClient() {

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

    builder.addInterceptor(new Interceptor() {
        @Override
        public Response intercept(Chain chain) throws IOException {
            Response response = chain.proceed(chain.request());

            return response;
        }
    });

    builder.addInterceptor(new Interceptor() {
        @Override
        public Response intercept(Chain chain) throws IOException {
            //this is where we will add whatever we want to our request headers.
            Request request = chain.request().newBuilder()
                    .addHeader("Accept", "application/json")
                    .addHeader("Content-Type", "application/json")
                    .build();
            return chain.proceed(request);
        }
    });

    return builder.build();
}
}

有人能帮我吗?


我是否总是需要使用@header调用我的经过身份验证的请求?这取决于您在服务器上实现身份验证的方式以及如何识别请求/设备。 - Tim
你能给我展示一个泛型的例子吗? - Felipe A.
您可以在RequestInterceptor的请求中添加标头,并将该拦截器添加到您的RestAdapter中。并且对于每个请求使用此rest adapter,这样您就不需要每次都添加标头。 - rushi
我无法给你展示一个例子。你甚至读了我说的话吗? - Tim
哦,现在我明白了... 我正在使用Spring Boot制作我的服务器端。使用WebSecurityConfigurerAdapter来阻止请求... - Felipe A.
3个回答

2
在NetworkService中使用@Header("Authorization") String authorization。
 Request request = chain.request().newBuilder()
                    .addHeader("Accept", "application/json")
                    .addHeader("Content-Type", "application/json")
                    .addHeader("Authorization", "AuthorizationValue")
                    .build();

你可以简单地检查if(islogin){.addHeader("Authorization", "AuthorizationValue")}。 - Rasoul Miri
我需要保存我的Application类上的信息吗? - Felipe A.
你可以使用共享首选项来保存和加载。 - Rasoul Miri
chain.request是什么? - IgorGanapolsky

0
如果您使用Retrofit 2,这里提供了一个在头部进行基本身份验证的示例。
public interface SomeApi {
@Headers({
   "Content-Type: application/json",
   "Authorization: Basic KzY1OTY0MjA4NTQ6MTExMTE="
})
@POST("test/someService")
Completable getTrips();

}


如果我需要提供动态授权头怎么办? - IgorGanapolsky
静态授权令牌不是应该使用的方法。 - ElliotM

0
  Step 1:
public interface ApiConnection {
     @GET("GET_LOCAL/{id}")
        fun colony(@Header("Authorization") authkey:String? ,
                      @Path("id") id:String?): Call<JsonObject> }

 step 2: create static Gloabalmethod 
fun Authpass(): String {
                    var data = ByteArray(0)
                    try {data =(CommonStatic.commonVariable.API_USERNAME + ":" + CommonStatic.commonVariable.API_PASSWORD).toByteArray(
                                charset("UTF-8"))
                    } catch (e: UnsupportedEncodingException) {
                        e.printStackTrace()
                    }
               return "Basic " + Base64.encodeToString(data, Base64.NO_WRAP)
                }
 Step 3:Retrofit Class
fun getSTP(): ApiCon? {
        val gson: Gson = GsonBuilder()
            .setLenient()
            .create()
        val r: Retrofit = Retrofit.Builder().baseUrl(CommonStatic.commonVariable.BASE_URL_PTS)
            .addConverterFactory(GsonConverterFactory.create(gson)).build()
        return r.create(ApiConnection::class.java)
    }
step 4 : call 


try {
 val call: Call<JsonObject>?=RetrofitCall.retrofit.getSTP()?.colony(GloabalClass.GloabalMethod.Authpass(),id)
 if (call != null) {
       call.enqueue(object : Callback<JsonObject> {
     override fun onResponse(call: Call<JsonObject>, response: Response<JsonObject>) 
 {
       if (response.isSuccessful) {
        val ward : JsonObject? = response.body()
        val jsonObject = JSONObject(ward.toString())
     val colonyArray: JSONArray = jsonObject.getJSONArray("Result")} else {Toast.makeText(applicationContext, "Failed", Toast.LENGTH_SHORT).show()}}override fun onFailure(call: Call<JsonObject>, t: Throwable) {
  Log.d("loginAuthendication", "failure--" + t.toString())
 Toast.makeText(applicationContext, "NO INTERNET CONNECTION ", Toast.LENGTH_SHORT).show()
                            }
                        }) }
            } catch (e: Exception) {
                Log.d("loginAuthendication", e.toString())
            }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接