在之前的项目中,使用传统的HttpClient来返回一个图片信息流的时候总是报错,最后发现是因为传统的传输方式会对流的大小有限制,当超过某个值的时候就会报异常,最后决定使用OkHttp框架来解决这个问题。实例如下:

package com.xiao.controller;

import okhttp3.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod; import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.TimeUnit; public class AdController {
private Logger logger= LoggerFactory.getLogger(this.getClass()); private 。okHttpClient= new OkHttpClient.Builder()
.connectTimeout(30, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.writeTimeout(30, TimeUnit.SECONDS)
.retryOnConnectionFailure(true)
.build(); private String appcenterUrl="http://localhost:8085"; @RequestMapping(value = "getImage",method = {RequestMethod.GET,RequestMethod.POST})
public void getImageUrl(HttpServletResponse response){
Map<String,String> params=new HashMap<>();
String url=appcenterUrl+"/adCenter"+"/downloadImg";
try {
Response res = exPost(url,params).execute(); if(res.code()==200){
if(res.body()!=null){
byte[] bytes = res.body().bytes();
String contentType = res.header("Content-type");
if(contentType!=null){
response.addHeader("Content-type",contentType);
}
response.addHeader("Content-Length",String.valueOf(bytes.length));
try (ServletOutputStream outputStream=response.getOutputStream()){
outputStream.write(bytes);
outputStream.flush();
}catch (IOException e){
response.setStatus(500);
}
}
}else {
logger.error("错误码"+res.code());
response.setStatus(500);
}
}catch (IOException e){
logger.error("错误信息"+e);
response.setStatus(500);
} }
private Call exPost(String url, Map<String,String> addedParams) {
FormBody.Builder params = new FormBody.Builder();
Iterator var5 = addedParams.entrySet().iterator();
while (var5.hasNext()){
Map.Entry<String, String> next = (Map.Entry) var5.next();
params.add(next.getKey(),next.getValue());
}
Request request = (new okhttp3.Request.Builder())
.url(url)
.post(params.build())
.build();
return okHttpClient.newCall(request);
}
private Call post(String url, Map<String, String> addedParams) {
FormBody.Builder params = new FormBody.Builder(StandardCharsets.UTF_8); for (Map.Entry<String, String> entry : addedParams.entrySet()) {
params.add(entry.getKey(), entry.getValue());
}
Request request = new Request.Builder()
.url(url)
.post(params.build())
.build();
return okHttpClient.newCall(request);
} }

这里的

OkHttpClient 中的时间你们可以自己选择定义的,不一定是30

这里还有一个需要大家思考的是如果用的是get请求,那这个又是怎么写?或者地址之后还有其他的参数,这个get可能需要自己去拼接,就像我们平时输入的一个地址一样

关于okHttp框架的使用的更多相关文章

  1. OkHttp框架从入门到放弃,解析图片使用Picasso裁剪,二次封装OkHttpUtils,Post提交表单数据

    OkHttp框架从入门到放弃,解析图片使用Picasso裁剪,二次封装OkHttpUtils,Post提交表单数据 我们这片博文就来聊聊这个反响很不错的OkHttp了,标题是我恶搞的,本篇将着重详细的 ...

  2. Android八门神器(一): OkHttp框架源码解析

    HTTP是我们交换数据和媒体流的现代应用网络,有效利用HTTP可以使我们节省带宽和更快地加载数据,Square公司开源的OkHttp网络请求是有效率的HTTP客户端.之前的知识面仅限于框架API的调用 ...

  3. Android精通之OrmLite数据库框架,Picasso框架,Okio框架,OKHttp框架

    版权声明:未经博主允许不得转载 OrmLite基础知识 什么是OrmLite框架,在我没用这个框架时,不知道它有多好,用了才知道很方便哦,为了提供开发效率,Android开发者需要懂得运行多种框架进行 ...

  4. android 开发 - 使用okhttp框架封装的开发框架

    概述 在android开发中经常要访问网络,目前最流行的网络访问框架就是Okhttp了,然而我们在具体使用时,往往仍然需要二次封装.我使用Builder设计模式进行了封装形成oknet开源库. 介绍 ...

  5. okhttp框架源码分析从同步&异步请求使用开始

    对于okhttp在如今项目中的普及程度已经不言而喻啦,基本上如今网络请求都会基于它去进行封装,而非前几年用Android的网络框架HttpURLConnection和Apache HttpClient ...

  6. Android网络请求之OkHttp框架

    首先声明权限 <uses-permission android:name="android.permission.INTERNET"/> 在build.gradle中加 ...

  7. 用Okhttp框架登录之后的Cookie设置到webView中(转)

    1.webview中设置: [java] view plain copy @SuppressWarnings("deprecation") public void synCooki ...

  8. 一张图带你了解OKhttp框架

  9. Android网络框架OkHttp之get请求(源码初识)

    概括 OkHttp现在很火呀.于是上个星期就一直在学习OkHttp框架,虽然说起来已经有点晚上手了,貌似是2013年就推出了.但是现在它版本更加稳定了呀.这不,说着说着,OkHttp3.3版本在这几天 ...

随机推荐

  1. 让zepto支持ie

    找到zepto源码:修改为如下代码: zepto.Z = function(dom, selector) { dom = dom || [] // 支持ie10,主要是支持wp8 if(window. ...

  2. Java 重写hashCode() 时为什么要用 31 来计算

    在OSChina 中看到了一篇文章<Java 中正确使用 hashCode 和 equals 方法>,看到 hashCode 的方法体内的31比较有意思. 在Stackoverflow上找 ...

  3. Personal Geodatabase - Can't Create New or Open Existing

    来自:http://forums.arcgis.com/threads/32110-Personal-Geodatabase-Can-t-Create-New-or-Open-Existing Per ...

  4. C++基础--extern的用法

    extern作为外部变量扩展的用法: 1. 主要作用是扩展变量或者函数的应用范围: 2. extern的用法是相对于全局变量而言: 3. 在看到extern这个关键字的时候说明这个变量已经在别的源文件 ...

  5. RecycleView + SwipeRefreshLayout 实现下拉刷新和底部自动加载

    前段时间项目里面使用了RecycleView 但是里面的刷新和加载都是框架里面封装好的,直接使用 这几天比较闲就自己来实现以下. 因为SwipeRefreshLayout是一个下拉刷新控件所有直接和R ...

  6. IT集中监控

    监控的从底层到上应该是: 一 数据采集层 二 数据处理层 三 数据展示层 监控需要和ITIL中定义的服务进行相当多的交互,例如监控会使用配置管理数据库CMDB来记录和读取数据,会将事件处理方式从知识库 ...

  7. ORACLE中一个字符占多少字节?

    问题描述 或许你会说一个中文字符占2个字节,这是一定的?如何计算一个字符串的字节数? 解决方案 在oracle中一个字符特别是中文占几个字节是不同的. 比如我创立一个表create table tes ...

  8. synchronized(this)、synchronized(class)与synchronized(Object)的区别

    在多线程开发中,我们经常看到synchronized(this).synchronized(*.class)与synchronized(任意对象)这几种类型同步方法.但是是否知道这几种写法有什么区别了 ...

  9. Linux 配置 ss

    Linux 配置 Shadowsocks 标签(空格分隔): ss VPS 1.首先安装 sudo pip install shadowsocks 2.然后在指定位置新建shadowsocks.jso ...

  10. ring0 恢复SSDTHook

    原理: 用ZwQuerySystemInformation 功能号为11(SystemModuleInformation)  得到所有系统模块的地址 遍历搜索得到ntos模块的基地址 读Ntos模块到 ...