在Android上,原生API有两个,HttpUrlConnection和HttpClient,它们对封装Socket进行封装,让HTTP请求变得简单。这应该也算框架吧?

想象下,如果没有HttpUrlConnection和HttpClient,一次性的API请求得有多麻烦。

现在,我们又多了一种OkHttp,Square出品。当然底层还是封装socket。为什么,为什么还要再出一个OkHttp,吃饱了撑的?肯定不是,那究竟有什么好的?自己动手查一下吧。

我们假设一下,应该是HttpUrlConnection和HttpClient自身有bug和缺陷,所以才会再根据如今的网络情况设计OkHttp吧。

如果你看过Volley的源代码,就知道当SDK>9时,默认使用HttpUrlConnection,<9的就用HttpClient。 

既然>9采用HttpUrlConnection了,那说明,再以后的版本中由Android修复了,那HttpClient呢,Apache更新维护太慢,基本要被淘汰。

如果说你的项目还在用HttpClient,甚至还在为HttpClient的某些bug而苦恼,那么你该考虑是否该换了。毕竟现实不可能给你那么多时间去调研debug。

当然OkHttp也是有bug的,从github上的issues就能知道,如果你用OkHttp发现了bug,又不知道如何解决,不妨去那看看。

说了这么多,Stay想表达的有两层意思: 
1. 不妨使用新技术来解决老技术的缺陷,就好像如果现在还有人用TabActivity,TabHost,那给人感觉一定是做外包出身的。 
2. 尝试新技术的成本不高的,如果它开源,并且有release版本(1.0+),你都可以集成试试。新技术都是为了更好的开发而被设计出来的,就算它不是最优的解决方案,至少设计理念,解决思路是值得参考的。

今天下午花了点时间,粗略的过了一遍OkHttp,有意思的是,为了让大家无缝集成,也是蛮拼的,额外提供HttpUrlConnection和HttpClient的写法。你只需要再依赖okhttp-urlconnection.jar或者okhttp-apache.jar就可以了。

本来Stay是打算用OkHttp自己的请求API集成的自己的网络框架里,捣鼓了半天,怪麻烦的,API来来回回要找半天,索性就直接换成HttpUrlConnection的形式写了。 

see, 集成起来太方便了。简单的测试了下,get,post,上传,下载都没问题。其他就没再深入了。

代码已在Stay讲的[自己动手写个Http框架]中更新,想尝鲜的可以去看看。

OkHttp的示例都很简单,有很多配置(ssl, cookies, headers, timeout)没详细说明,那如果你想配置,该怎么做捏。可以看源码,也可以看一些网络请求框架如:Retrofit(Square的网络请求框架,默认集成OkHttp)源码中的API配置。


对于这类底层API创新,还是比较少的,几年内能出一个就不错了,毕竟对HTTP协议融会贯通而且能优化的大牛少之又少。对于一般的苦逼开发者来说,能做到及时跟进已属不易。

多尝试新技术,至少可以晚些结束自己的程序员生涯 :)


有心课堂,传递给你的不仅仅是技术。✈️ www.stay4it.com

[HTTP那些事]网络请求API的更多相关文章

  1. 第三篇、微信小程序-网络请求API

    wx.request(OBJECT)发起的是https请求.一个微信小程序,同时只能有5个网络请求连接. OBJECT参数说明: 效果图: net.js Page({ data:{ result:{} ...

  2. 09事件传递参数-封装网络请求api get和post合并整合在一起

    1==>通过点击事件进行传递参数 <view bindtap="goEdution" data-index="5">西南大学</view ...

  3. iOS - ASIHTTPRequest 网络请求

    前言 使用 iOS SDK 中的 HTTP 网络请求 API,相当的复杂,调用很繁琐,ASIHTTPRequest 就是一个对 CFNetwork API 进行了封装,并且使用起来非常简单的一套 AP ...

  4. 一步步搭建Retrofit+RxJava+MVP网络请求框架(一)

    首先,展示一下封装好之后的项目的层级结构. 1.先创建一个RetrofitApiService.java package com.xdw.retrofitrxmvpdemo.http; import ...

  5. 一步步搭建Retrofit+RxJava+MVP网络请求框架(二),个人认为这次封装比较强大了

    在前面已经初步封装了一个MVP的网络请求框架,那只是个雏形,还有很多功能不完善,现在进一步进行封装.添加了网络请求时的等待框,retrofit中添加了日志打印拦截器,添加了token拦截器,并且对Da ...

  6. React Native 网络请求封装:使用Promise封装fetch请求

    最近公司使用React作为前端框架,使用了异步请求访问,这里做下总结: React Native中虽然也内置了XMLHttpRequest 网络请求API(也就是俗称的ajax),但XMLHttpRe ...

  7. 微信小程序网络请求wx.request请求

    最近微信小程序开始开放测试了,小程序提供了很多api,极大的方便了开发者,其中网络请求api是wx.request(object),这是小程序与开发者的服务器实现数据交互的一个很重要的api. 百牛信 ...

  8. 微信小程序request请求实例,网络请求。

    最近微信小程序开始开放测试了,小程序提供了很多api,极大的方便了开发者,其中网络请求api是wx.request(object),这是小程序与开发者的服务器实现数据交互的一个很重要的api. 官方参 ...

  9. 百度语音识别REST API——通过使用Http网络请求方式获得语音识别功能

    百度语音识别通过REST API的方式给开发人员提供一个通用的HTTP接口,基于该接口,开发人员能够轻松的获取语音识别能力,本文档描写叙述了使用语音识别服务REST API的方法. 长处: 较之开发人 ...

随机推荐

  1. FindinFiles - Windows文件内查找插件

    FindInFiles for Windows 今天分享一个不错的插件工具:FindInFiles.如其名,其功能和Visual Studio的Ctrl+H快捷键类似,方便Windows使用者在资源管 ...

  2. codeforces 336 Div.2 B. Hamming Distance Sum

    题目链接:http://codeforces.com/problemset/problem/608/B 题目意思:给出两个字符串 a 和 b,然后在b中找出跟 a 一样长度的连续子串,每一位进行求相减 ...

  3. 获取指定文件下的所有file文件

    /** * 描述:获取所有的文件列表 * @param file * @param list * @return */ private List<File> getAllFiles(Fil ...

  4. 【Bochs 官方手册翻译】 第一章 Bochs介绍

    Bochs 是一个可以完全模拟 Intel x86 计算机的虚拟机系统.它包含了 Intel x86 CPU 仿真.常见设备仿真.以及定制 BIOS.Bochs 可以虚拟多种不同类型的 x86 CPU ...

  5. xcode报错,svn : is not a workingCopy

    解决方案: 1.点击对应的targets 2.选择build phases 3.在红框处有一个run script选项(截图中已经删除了.),点击下拉按钮,看看是否是与svn有关的东西, 如果是,删除 ...

  6. php dirname($path) 中文路径不对问题

    将$path中的\改为/ $dir=__FILE__;$dir = str_replace("\\","/", $dir);$dir=dirname($dir) ...

  7. August 20th 2016 Week 34th Saturday

    Everything you see exists together in a delicate balance. 你所看到的一切都处于微妙的平衡中. Seeking for balance in l ...

  8. C 替换字符方法

    // 444.cpp : Defines the entry point for the console application. // #include "stdafx.h" # ...

  9. Spring.Net的AOP的通知

    一.拦截环绕通知(around advice):Spring.NET中最基本的通知类型是拦截环绕通知(interception around advice),即方法拦截器.拦截环绕通知继承IMetho ...

  10. Delphi之DLL知识学习5---在Delphi应用程序中使用DLL

    首先说明一下:同一个动态库(DLL)被多个的程序加载的话,那么将会在每次加载的时候都会重新分配新的独立的内存空间,绝对不是共用一个,所以当一个DLL被多次加载的时候,其会在内存中“复制”多份,不会互相 ...