okhttp是Android6.0推出的网络框架。由于谷歌在Android6.0的之后,将HttpClient相关属性取消掉,导致Volley框架不能正常使用。所以才有了今天的Okhttp。

Okhttp进行网络访问通常有两种方式,一种是get请求,还有一种叫做post请求。
1、OKhttp的get请求
通常,我们使用get方式来请求一个网站,是依靠url地址的。Okhttp使用get方式来请求网站通常有如下的步骤:
A、创建OkhttpClient的变量,这个变量相当于是一个全局的执行者。主要的网络操作是依靠它来进行的。
B、创建一个builder对象。
C、利用builder对象创建一个Request对象。
D、使用全局执行者来创建一个Call对象。
E、通过Call对象来进行网络连接。
public void doGet(View view)
{
Request.Builder builder = new Request.Builder();
Request request = builder.get().url(urlString + "userName=pby&userPassword=123").build();
Call newCall = mOkHttpClient.newCall(request);
//newCall.execute()
newCall.enqueue(new Callback() {
@Override
public void onFailure(Request request, IOException e) {
L.e("失败了");
}
@Override
public void onResponse(Response response) throws IOException {
String string = response.body().string();
L.e(string);
}
});
}
2、Okhttp的Post请求
Post请求与get请求有些不一样。get请求主要的功能是从服务器上获取数据,而Post请求则是向服务器提交数据。
public void doPost(View view)
{
FormEncodingBuilder requestBodyBuilder = new FormEncodingBuilder();
RequestBody requestBody = requestBodyBuilder.add("userName", "pby").add("userPassword", "123").build();
Request.Builder builder = new Request.Builder();
Request request = builder.url(urlString).post(requestBody).build();
Call newCall = mOkHttpClient.newCall(request);
executeCall(newCall);
}
3、服务器端接收客户端传过来的字符串
客户端的代码:
public void doPostString(View view)
{
RequestBody requestBody = RequestBody.create(MediaType.parse("text/plain;charset = utf-8"), "{name = pby, password = 1234}");
Request.Builder builder = new Request.Builder();
Request request = builder.url(urlString + "doPostString").post(requestBody).build();
Call newCall = mOkHttpClient.newCall(request);
executeCall(newCall);
}
服务器端的代码:
public String doPostString() throws IOException
{
HttpServletRequest request = ServletActionContext.getRequest();
ServletInputStream inputStream = request.getInputStream();
StringBuilder sb = new StringBuilder();
int len = 0;
byte []buff = new byte[1024];
while((len = inputStream.read(buff)) != -1)
{
sb.append(new String(buff, 0, len));
}
System.out.println(sb.toString());
return null;
}
服务器端如果要接收客户端的数据,则需要接收request;如果服务器端想要给客户端传数据,则需要通过response来传递。
4、使用post方式进行文件的传输
客户端的代码
public void doPost(View view)
{
FormEncodingBuilder requestBodyBuilder = new FormEncodingBuilder();
RequestBody requestBody = requestBodyBuilder.add("userName", "pby").add("userPassword", "123").build();
Request.Builder builder = new Request.Builder();
Request request = builder.url(urlString + "login").post(requestBody).build();
Call newCall = mOkHttpClient.newCall(request);
executeCall(newCall);
}
关于选择文件的代码--抄袭网络上的代码,并不是自己写的
private void showFileChooser() {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("*/*");
intent.addCategory(Intent.CATEGORY_OPENABLE);
try {
startActivityForResult( Intent.createChooser(intent, "Select a File to Upload"), 1);
} catch (android.content.ActivityNotFoundException ex) {
Toast.makeText(this, "Please install a File Manager.", Toast.LENGTH_SHORT).show();
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case 1:
if (resultCode == RESULT_OK) {
// Get the Uri of the selected file
Uri uri = data.getData();
String path = FileUtils.getPath(this, uri);
if(path != null)
{
postFile(path);
}
}
break;
}
super.onActivityResult(requestCode, resultCode, data);
}
在进行这个的操作的时候,一定要记住增加读和写的权限,否则会上传失败的。
服务器端的代码
public String doPostFile() throws IOException
{
HttpServletRequest request = ServletActionContext.getRequest();
ServletInputStream inputStream = request.getInputStream();
String dir = ServletActionContext.getServletContext().getRealPath("files");
File file = new File(dir, "abc.jpg");
FileOutputStream fos = new FileOutputStream(file);
int len = 0;
byte [] buff = new byte[1024];
while((len = inputStream.read(buff)) != -1)
{
fos.write(buff, 0, len);
}
fos.flush();
fos.close();
return null;
}
上面显示的files文件,在Tomcat的webapps下的工程名名文件下的fies文件夹(才开始是没有这个文件夹的,需要手动自己创建)。
5.使用Post方式来上传文件
客户端代码:
private void upLoadFile(String path)
{
File file = new File(path);
if(!file.exists())
{
return ;
}
MultipartBuilder multipartBuilder = new MultipartBuilder();
RequestBody requestBody = multipartBuilder.type(MultipartBuilder.FORM)
.addFormDataPart("userName", "pby")
.addFormDataPart("userPassword", "123")
.addFormDataPart("mFile", file.getName(), RequestBody.create(MediaType.parse("application/octet-stream"), file)).build();
// CountingRequestBody countingRequestBody = new CountingRequestBody(requestBody, new CountingRequestBody.MyListener() {
// @Override
// public void onRequestProgress(int byteWriteCount, int TotalCount) {
// L.e(byteWriteCount + " / " + TotalCount);
// }
// });
Request.Builder builder = new Request.Builder();
//Request request = builder.url(urlString + "doUpLoadFile").post(countingRequestBody).build();
Request request = builder.url(urlString + "doUpLoadFile").post(requestBody).build();
Call newCall = mOkHttpClient.newCall(request);
executeCall(newCall);
}
服务器端的代码:
public String doUpLoadFile()
{
if(mFile == null)
{
System.out.println(mFileFileName+" is null..");
return null;
}
String dir = ServletActionContext.getServletContext().getRealPath("files");
File file = new File(dir, mFileFileName);
try {
FileUtils.copyFile(mFile, file);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
在上传文件的时候,有一个小细节都注意到:就是Tomcat服务器只允许上传2m以下的文件。要想上传大文件,就必须在struct文件中加一句:<constant name="struts.multipart.maxSize" value="1024000000"/>数字表示自定义大小的限制。
6.上传文件时,进度的显示问题
在写代码的时候我们知道,我们不能直接获得上传文件的进度。因为这些数据都是封装在RequestBody里面的,要想使用只有通过回调接口来实现。
package com.example.android_okhttp;
import com.squareup.okhttp.MediaType;
import com.squareup.okhttp.RequestBody;
import java.io.IOException;
import okio.Buffer;
import okio.BufferedSink;
import okio.ForwardingSink;
import okio.Okio;
import okio.Sink;
/**
* Created by 前世诀别的一纸书 on 2017/3/5.
*/
public class CountingRequestBody extends RequestBody {
private RequestBody delegate = null;
private MyListener mListener= null;
private CountingSink mCountSink = null;
public interface MyListener
{
void onRequestProgress(int byteWriteCount, int TotalCount);
}
public CountingRequestBody(RequestBody requestBody, MyListener listener)
{
delegate = requestBody;
mListener = listener;
}
@Override
public MediaType contentType() {
return delegate.contentType();
}
@Override
public void writeTo(BufferedSink sink) throws IOException {
mCountSink = new CountingSink(sink);
BufferedSink bs = Okio.buffer(mCountSink);
delegate.writeTo(bs);
bs.flush();
}
private class CountingSink extends ForwardingSink{
private int byteWriteCount = 0;
public CountingSink(Sink delegate) {
super(delegate);
}
@Override
public void write(Buffer source, long byteCount) throws IOException {
super.write(source, byteCount);
byteWriteCount += byteCount;
mListener.onRequestProgress(byteWriteCount, (int) contentLength());
}
}
@Override
public long contentLength() throws IOException {
return delegate.contentLength();
}
}
MultipartBuilder multipartBuilder = new MultipartBuilder();
RequestBody requestBody = multipartBuilder.type(MultipartBuilder.FORM)
.addFormDataPart("userName", "pby")
.addFormDataPart("userPassword", "123")
.addFormDataPart("mFile", file.getName(), RequestBody.create(MediaType.parse("application/octet-stream"), file)).build();
CountingRequestBody countingRequestBody = new CountingRequestBody(requestBody, new CountingRequestBody.MyListener() {
@Override
public void onRequestProgress(int byteWriteCount, int TotalCount) {
L.e(byteWriteCount + " / " + TotalCount);
}
});
Request.Builder builder = new Request.Builder();
Request request = builder.url(urlString + "doUpLoadFile").post(countingRequestBody).build();
//Request request = builder.url(urlString + "doUpLoadFile").post(requestBody).build();
Call newCall = mOkHttpClient.newCall(request);
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# android
# okhttp
# 使用
# okhttp3
# 详解Android中使用OkHttp发送HTTP的post请求的方法
# Android的OkHttp包中的HTTP拦截器Interceptor用法示例
# Android的HTTP扩展包OkHttp中的缓存功能使用方法解析
# Android M(6.x)使用OkHttp包解析和发送JSON请求的教程
# Android使用okHttp(get方式)下载图片
# 使用Android的OkHttp包实现基于HTTP协议的文件上传下载
# 详解Android使用OKHttp3实现下载(断点续传、显示进度)
# 使用OkHttp包在Android中进行HTTP头处理的教程
# Android使用okHttp(get方式)登录
# Android OkHttp的简单使用和封装详解
# Android的OkHttp包处理用户认证的代码实例分享
# 客户端
# 上传文件
# 创建一个
# 要想
# 上传
# 则需
# 都是
# 是一个
# 一句
# 则是
# 是从
# 注意到
# 自定义
# 正常使用
# 有两种
# 来实现
# 则会
# 回调
# 装在
# 它来
相关文章:
制作公司内部网站有哪些,内网如何建网站?
单页制作网站有哪些,朋友给我发了一个单页网站,我应该怎么修改才能把他变成自己的呢,请求高手指点迷津?
如何在IIS中配置站点IP、端口及主机头?
魔毅自助建站系统:模板定制与SEO优化一键生成指南
网站制作新手教程,新手建设一个网站需要注意些什么?
宠物网站制作html代码,有没有专门介绍宠物如何养的网站啊?
免费网站制作appp,免费制作app哪个平台好?
制作农业网站的软件,比较好的农业网站推荐一下?
公司网站制作价格怎么算,公司办个官网需要多少钱?
建站主机类型有哪些?如何正确选型
家庭建站与云服务器建站,如何选择更优?
深圳网站制作的公司有哪些,dido官方网站?
C++如何编写函数模板?(泛型编程入门)
平台云上自主建站:模板化设计与智能工具打造高效网站
建站OpenVZ教程与优化策略:配置指南与性能提升
如何在万网自助建站平台快速创建网站?
建站之星安装失败:服务器环境不兼容?
建站之星免费模板:自助建站系统与智能响应式一键生成
建站主机无法访问?如何排查域名与服务器问题
高性能网站服务器部署指南:稳定运行与安全配置优化方案
网站制作培训多少钱一个月,网站优化seo培训课程有哪些?
c# 在高并发场景下,委托和接口调用的性能对比
如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?
名字制作网站免费,所有小说网站的名字?
网站制作费用多少钱,一个网站的运营,需要哪些费用?
如何彻底删除建站之星生成的Banner?
建站主机数据库如何配置才能提升网站性能?
如何在阿里云完成域名注册与建站?
建站之星安装需要哪些步骤及注意事项?
专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?
网站制作难吗安全吗,做一个网站需要多久时间?
平台云上自助建站如何快速打造专业网站?
昆明网站制作哪家好,昆明公租房申请网上登录入口?
如何通过虚拟主机空间快速建站?
如何用IIS7快速搭建并优化网站站点?
如何通过老薛主机一键快速建站?
郑州企业网站制作公司,郑州招聘网站有哪些?
国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?
制作网站的过程怎么写,用凡科建站如何制作自己的网站?
Swift开发中switch语句值绑定模式
logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?
建站之星24小时客服电话如何获取?
如何选择高效可靠的多用户建站源码资源?
存储型VPS适合搭建中小型网站吗?
C++时间戳转换成日期时间的步骤和示例代码
如何高效配置IIS服务器搭建网站?
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
浅谈Javascript中的Label语句
如何在阿里云香港服务器快速搭建网站?
网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?
*请认真填写需求信息,我们会在24小时内与您取得联系。