初步猜测原因:
okhttp并非原生的http请求,它在header里面并没有真正的User-Agent,而是“okhttp/版本号”这样的字符串;
解决方案:
为okhttp设置User-Agent可以解决问题。
OkHttpClient.Builder builder = new OkHttpClient().newBuilder() ;
builder.addInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request newRequest = chain.request().newBuilder()
.removeHeader("User-Agent")
.addHeader(
"User-Agent",
"Mozilla/5.0 (
Windows; U; Windows NT 5.1; en-US; rv:0.9.4
).build() ;
return chain.proceed(newRequest);
OkHttpClient client = builder.build()
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(FastJsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.client(client)
.build()
初步猜测原因: okhttp并非原生的http请求,它在header里面并没有真正的User-Agent,而是“okhttp/版本号”这样的字符串;解决方案: 为okhttp设置User-Agent可以解决问题。OkHttpClient.Builder builder = new OkHttpClient().newBuilder() ; builder.addIntercept...
public interface Api {
@POST(product/getProductDetail)
Observable getGoods(@QueryMap Map map);
@POST(product/addCart)
Observable getAdd(@QueryMap Map map);
@POST(product/getCarts)
Observable getShopCar(@Q
https:网络请求实现模块。
model:数据模型,实体类定义。
repository:数据仓库,包括网络接口请求数据,sqlite数据库,文件File存储,SharedPreferences数据存储。
view:视图层,包含Activiy+Fragment类。
viewmodel:控制层。
utils:工具模块。
某些API应该是服务器设置了限制,使得手机端okhttp作为 http客户端时,获取数据,服务器返回HTTP 403禁止访问。
服务器禁止访问了,因为okhttp并不是真正的原生的http请求,它在header中并没有真正的User-Agent,而是“okhttp/版本号”。
如果是单纯的okHttp请求,不加Retrofit的
Request request = new Request.Builder().url(url)
.removeHe...
异常处理
Retrofit本身会抛出HttpException,Gson解析会抛出解析异常,
此外我们还应该处理与服务器约定好的“异常”,即上一篇提到的返回数据中result字段值不会0的情况这里要先解决一个问题,就是Gson构建的对象,通过注解定义key名,以变量的类型定value的类型,
但如果同样的key在不同情况下属于不同的数据类型,就会出问题。 假如服务器返回格式是{
开始本博客之前,请先阅读:
Retrofit请求数据对错误以及网络异常的处理 异常&错误实际开发经常有这种情况,比如登录请求,接口返回的
信息包括请求返回的状态:失败还是成功,错误码,User对象等等。如果网络等原因引起的登录失败可以归结为异常,如果是用户信息输入错误导致的登录失败算是错误。假如服务器返回的是统一数据格式:/**
* 标准数据格式
* @param <T>
最近项目中遇到一件怪事,在get请求中发现没有数据,在debug时候发现居然爆了一个retrofit2.adapter.rxjava.HttpException: HTTP 400错误。经过查阅资料发现400 请求出错
由于语法格式有误,服务器无法理解此...
dependencies {
implementation 'com.squareup.
retrofit2:
retrofit:2.9.'
implementation 'com.squareup.
retrofit2:converter-gson:2.9.'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.1'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.1'
2. 创建一个
Retrofit实例:
val
retrofit =
Retrofit.Builder()
.baseUrl("https://
api.example.com/")
.addConverterFactory(GsonConverterFactory.create())
.build()
3. 创建一个接口来定义
API:
interface
ApiService {
@GET("users/{user}/repos")
suspend fun listRepos(@Path("user") user: String): List<Repo>
4. 使用协程来发起网络请求:
val service =
retrofit.create(
ApiService::class.java)
val repos = service.listRepos("octocat")
以上就是使用Kotlin协程和
Retrofit生成网络请求框架的基本步骤。
Python numpy Import Error Something is wrong with the numpy installation. an older
金焱111: