Skip to content
廖子尧 edited this page Jul 14, 2017 · 7 revisions

1. NoClassDefFoundError异常,或者在5.0以上系统程序正常,5.0以下系统crash等问题

如果你的报错日志如下:

那么这个问题是你使用的,mutidex打包导致的,详细解决方案查看这个链接:https://stackoverflow.com/questions/35578135/noclassdeffounderror-for-okhttpclient

如果你不想看,直接看这个截图:

2. 设置Content-Type为什么无效

首先,记住任何时候,任何地方,以下这两行设置代码永远不起作用。

headers("Content-Type", "你自己设置的值")
headers("Content-Length", 一个数值)

Content-Type将遵循以下规则,Content-Length永远自动根据你上传的内容的真实大小自动添加,不可修改

警告:

所有up开头的方法不能与params()方法混用,如果混用,将按up方法的行为来,所有params()设置的参数将丢失。

以下表格来自OkGO文档的总结:

调用方法 对应的Content-Type
upStrig() text/plain;charset=utf-8
upString(string,mediaType) 值就是你传进来的这个值,只是你只能上传文本数据
upJson() application/json;charset=utf-8
upBytes() application/octet-stream
upFile() 1. 会尝试自动根据你的文件后缀名去自动找到最适合他的Content-Type2. 如果找不到,那么默认使用application/octet-stream
upRequestBody() 这里就是直接上传okhttp原生的RequestBody,你怎么构建的,他就传什么
params(string,string) 如果你的所有params()方法都是传的字符串,并没有文件,那么默认使用以下值: application/x-www-form-urlencoded
params(string,file) 不论你有多少个params(),只要有一个传的是File,那么本次请求就将使用以下值:multipart/form-data; boundary=f6b76bad-0345-4337-b7d8-b362cb1f9949
isMultipart(true) 当你所有的params()都是字符串,同时你还想你的Content-Typemultipart/form-data,那么使用该方法

3. okgo支持断点下载,或者断点上传吗?

okgo不支持断点下载
okserver支持断点下载
断点上传都不支持,至于为什么,看这里吧:有没有可能加入 断点/分片 上传的功能

4. 下载进度为什么是负数?

下载文件的时候,如果仅仅是读写文件流,客户端是无法知道文件的总大小的,但是服务端可以额外通过Content-Length头来告诉客户端,如果返回了,那么就是文件的大小,如果不返回,默认就是-1,所以如果你发现进度为-1,请联系服务端返回Content-Length响应头。

5. 如何上传数组参数,如何上传对象?

在回答这个问题前,强烈建议先看看Http协议,因为如果你懂那么一点点的Http协议,就不会有这么个问题。学习协议和抓包的链接点击这里

此外,这里我写了一个用图文结合,代码和抓包配合看的文档,如果你看完,这个问题也就不会问了,点击查看传参与抓包(必看)

那么简单说就是,怎么传参数,取决于服务端的接口怎么定义,我们都知道传参是需要键值对的,假如键叫item,要传一个数组,值是['a','b','c'],那么请问服务端希望怎么接受这个值,可能不同的服务端有以下的接受方式

  1. item=['a','b','c']
  2. item[]=['a','b','c']
  3. item[1]=a&item[2]=b&item[3]=c
  4. item=a&item=b&item=c

你猜框架会不会知道怎么传递这些参数?除非框架是先知。

那能不能上传一个对象呢?这个就更不行了,不是okgo不能传,而是不知道怎么传你的对象?

  1. 是转成json传给服务器呢?是所有字段都转,还是只转部分字段?
  2. 是转成xml传给服务器呢?是所有字段都转,还是只转部分字段?
  3. 是序列化对象,直接给服务端传个对象流呢? 你再猜框架会不会知道怎么传?

所以这是个很简单的问题,我为什么要写这么多,就是因为很多人,很多人,很多人,真的是一点不懂http协议,然后就做网络请求,这样会闹出很多笑话,如果你打算做个程序员,搞软件开发,无论你现在有多忙,花半天时间好好看看http协议,然后在写代码,你会事半功倍,至于你信不信,听不听,自己决定喽。

Clone this wiki locally