LJ的Blog

学海无涯苦做舟

0%

Okhttp3-addHeader小坑记

##写在前面
最近感觉自己看了不少东西,不过在上班所以并没有很多的时间来写东西。我有一些半成品不过都不想发出来,毕竟缺少一点自己的东西在里面。好了日常唠嗑(1/1)。

##背景
前面也说了最近在上班,接触到的项目里用的都是被抛弃的httpclient,说实话这小项目我觉得我是有能力重构的。所以最近着手重构,重构之前首先选定要拿什么做。经过慎重的思考之后决定:项目尽量采用MVC的模式做,网络请求用okhttp(用hongyang封装的okhttp-utils),图片的处理和加载想采用glide,但是目前来看还有一些问题。好了背景介绍到这,下面说坑。

##坑
既然采用Okhttp来重写网络请求,我当然得挑几个出来跑一下试试。这一试问题就出来了,见下图:

error.png

415介质错误,等等,难道我请求写的有问题?好吧,真有可能,可能因为自己平时就粗心大意的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
      OkHttpUtils.postString()
// .mediaType(MediaType.parse("application/json; charset=utf-8"))
.content(jo.toString())
.addHeader("tkn", "--")
.addHeader("uid", "--")
.addHeader("Content-Type", "application/json")
.url(" ")
.build()
.execute(new BitmapCallback() {
@Override
public void onError(Call call, Exception e, int id) {
e.printStackTrace();
tvTest.setText("纳尼,竟然会错?");
}

@Override
public void onResponse(Bitmap response, int id) {
ivImg.setImageBitmap(response);
}
});

tkn和uid是验证登录的东西,这个东西我肯定是写的没错的,我这个请求我仔细看了一遍也没发现哪出了问题。但错就在那啊!

可能有细心的看官已经发现了,我注释了一行。是的,那一行就是解决问题的方法。在http头里面声明”Content-Type”, “application/json”在okhttp里面是没什么卵用的,okhttp中需要在mediaType中声明介质类型。

##小结
最近由于工作先后接触了HttpUrlConnection、HttpClient、okhttp,感觉api有的差不多,有的差别很大,关键还是你对于http协议的理解。只要你对http有一定的了解,对于一个有良好设计的东西来说找到对应的api是很容易的。