GET 请求在 Postman 中有效,但在 Android 和浏览器中无效
GET request working from Postman but not in Android and the browser
问题:
我正在使用 api,当我使用邮递员执行 GET 请求时,工作完美,我得到了预期的响应。但是,当我在浏览器和 Android Studio 中测试相同的获取请求时,它不起作用。
Postaman 片段:
https://i.stack.imgur.com/b2eeS.png
邮递员headers:
Content-Type: application/json
用户:Dermacycle2018
密码:(它是一个大密码)
设备:Iphone7
版本SO: IOS 11.2.2
版本APP:1.0.1
Postman-Token:发送请求时计算
Host:请求发送时计算
User-Agent: PostmanRuntime/7.28.2
接受:/
Accept-Encoding: gzip,deflate,br
连接:keep-alive
浏览器代码段:
https://i.stack.imgur.com/6KjpW.png
Android代码:
这里我使用改造来处理响应
interface DermaCycleApiClient {
@GET
suspend fun getTratamientosFaciales(@Url url:String)
:Response<TratamientosFacialesResponse>
}
fun getRetrofit():Retrofit{
return Retrofit.Builder().
baseUrl("http://dermaservice.theappmaster.com/")
.addConverterFactory(GsonConverterFactory.create())
.build()
}
suspend fun getTratamientosFaciales(tf:String):TratamientosFacialesResponse{
return withContext(Dispatchers.IO){
val response = retrofit.create(DermaCycleApiClient::class.java).
getTratamientosFaciales("http://dermaservice.theappmaster.com/Tratamiento.ashx?Tipo=TF")
response.body()!!
}
}
我相信您的 HTTP 请求需要几个 Headers 信息,从您的邮递员数据中可以看出。似乎,您需要在 Android 项目
的 HTTP 客户端 header 中添加 5 个 header 值
用户:Dermacycle2018
密码:(它是一个大密码)
设备:Iphone7
版本SO:IOS 11.2.2
版本APP:1.0.1
您可以使用拦截器将其添加到 OkHttpClient
生成器中。
class HeaderInterceptor: Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
val newRequest = chain.request().newBuilder()
.addHeader("User", "Dermacycle2018")
.addHeader("Password", ENCRYPTED_PASSWORD)
.addHeader("Device", DEVICE_NAME)
.addHeader("VersionSO", OS_VERSION)
.addHeader("VersionAPP", "1.0.1")
return chain.proceed(newRequest.build())
}
}
然后在您的 OkHttpClient
构建器中添加拦截器
val okHttpClient = OkHttpClient().newBuilder()
.addInterceptor(commonHeader)
.build
然后在您的改造构建器中添加 okHttpClient
fun getRetrofit(): Retrofit {
val okHttpClient = OkHttpClient().newBuilder()
.addInterceptor(commonHeader)
.build
return Retrofit.Builder()
.baseUrl("http://dermaservice.theappmaster.com/")
.addConverterFactory(GsonConverterFactory.create())
.client(okHttpClient)
.build()
}
问题: 我正在使用 api,当我使用邮递员执行 GET 请求时,工作完美,我得到了预期的响应。但是,当我在浏览器和 Android Studio 中测试相同的获取请求时,它不起作用。
Postaman 片段:
https://i.stack.imgur.com/b2eeS.png
邮递员headers:
Content-Type: application/json
用户:Dermacycle2018
密码:(它是一个大密码)
设备:Iphone7
版本SO: IOS 11.2.2
版本APP:1.0.1
Postman-Token:发送请求时计算
Host:请求发送时计算
User-Agent: PostmanRuntime/7.28.2
接受:/
Accept-Encoding: gzip,deflate,br
连接:keep-alive
浏览器代码段:
https://i.stack.imgur.com/6KjpW.png
Android代码:
这里我使用改造来处理响应
interface DermaCycleApiClient {
@GET
suspend fun getTratamientosFaciales(@Url url:String)
:Response<TratamientosFacialesResponse>
}
fun getRetrofit():Retrofit{
return Retrofit.Builder().
baseUrl("http://dermaservice.theappmaster.com/")
.addConverterFactory(GsonConverterFactory.create())
.build()
}
suspend fun getTratamientosFaciales(tf:String):TratamientosFacialesResponse{
return withContext(Dispatchers.IO){
val response = retrofit.create(DermaCycleApiClient::class.java).
getTratamientosFaciales("http://dermaservice.theappmaster.com/Tratamiento.ashx?Tipo=TF")
response.body()!!
}
}
我相信您的 HTTP 请求需要几个 Headers 信息,从您的邮递员数据中可以看出。似乎,您需要在 Android 项目
的 HTTP 客户端 header 中添加 5 个 header 值用户:Dermacycle2018
密码:(它是一个大密码)
设备:Iphone7
版本SO:IOS 11.2.2
版本APP:1.0.1
您可以使用拦截器将其添加到 OkHttpClient
生成器中。
class HeaderInterceptor: Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
val newRequest = chain.request().newBuilder()
.addHeader("User", "Dermacycle2018")
.addHeader("Password", ENCRYPTED_PASSWORD)
.addHeader("Device", DEVICE_NAME)
.addHeader("VersionSO", OS_VERSION)
.addHeader("VersionAPP", "1.0.1")
return chain.proceed(newRequest.build())
}
}
然后在您的 OkHttpClient
构建器中添加拦截器
val okHttpClient = OkHttpClient().newBuilder()
.addInterceptor(commonHeader)
.build
然后在您的改造构建器中添加 okHttpClient
fun getRetrofit(): Retrofit {
val okHttpClient = OkHttpClient().newBuilder()
.addInterceptor(commonHeader)
.build
return Retrofit.Builder()
.baseUrl("http://dermaservice.theappmaster.com/")
.addConverterFactory(GsonConverterFactory.create())
.client(okHttpClient)
.build()
}