使用 htaccess 改造调用

Retrofit call with htaccess

在我的应用程序中,我使用 api,其生产服务器是开放的,但其开发服务器受 htaccess 登录保护。

我需要测试 api 的开发服务器中的一些东西,但无法绕过 htaccess 墙。

我想我可以把它放在 URL 中,就像你在浏览器中做的那样,比如“https://username:password@example.com”,我意识到这会产生一些暴露的凭据问题,但我可以想到一个一些解决方法。

但是没有骰子。我收到 401 未经授权的错误,然后当我单击 link 时,我收到 401 未经授权的错误,它在我的浏览器中完美地加载了 api 的 json。

有没有办法绕过 retrofit2 中的 htaccess?我的代码在下面,当然隐藏了凭据和变量。

我的改造界面:

public interface DevApi {
    @POST("api/{data0}/{data1}/{data2}")
    fun getMoviesByCategory(@Path("data0") data0: String, @Path("data1") data1: Int, @Path("data2") data2: Int): Single<ArrayList<KMovie>>
}

我的互动者class:

class KMovieInteractorImpl : KMovieInteractor {

  @Inject
  lateinit var testAPI: DevApi

  init {
    DaggerMovieInteractorComponent.create().inject(this)
  }

  override fun getGenreMovies(data0: String, data1: Int, data2: Int): Single<ArrayList<KMovie>> {
    return testAPI.getMoviesByCategory(data0, data1, data2).subscribeOn(Schedulers.io())
  }
}

logcat 输出:

2020-04-13 16:56:33.839 11675-11935/com.myapp D/OkHttp: --> POST https://user:password@dev.api.biz/api/data0/data1/data2
2020-04-13 16:56:33.841 11675-11937/com.myapp D/OkHttp: --> POST user:password@dev.api.biz/api/data00/data1/data2
2020-04-13 16:56:34.153 11675-11937/com.myapp D/OkHttp: <-- 401 Unauthorized user:password@dev.api.biz/api/data0/data1/data2(312ms)
2020-04-13 16:56:34.157 11675-11937/com.myapp D/OkHttp: <address>Apache/2.4.29 (Ubuntu) Server at dev.api.biz Port 443</address>
2020-04-13 16:56:34.178 11675-11935/com.myapp D/OkHttp: <-- 401 Unauthorized https://user:password@dev.api.biz/api/data00/data1/data2 (337ms)

添加一个Authorization header:

public interface DevApi {
    @POST("api/{data0}/{data1}/{data2}")
    fun getMoviesByCategory(@Header("Authorization") auth: String, 
                            @Path("data0") data0: String, 
                            @Path("data1") data1: Int,                         
                            @Path("data2") data2: Int): Single<ArrayList<KMovie>>
}

并将你的基础 url 更改为 dev.api.biz。 您还可以使用 OkHttp3 中的 Credentials.basic(user, password) 函数来创建身份验证 header.