在之前的项目中,使用传统的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. ArcGIS for Server安全与LDAP配置

    ArcGIS for Server安全与LDAP配置 1.安全性概述 ArcGIS Server使用基于角色的访问控制来管理对受保护资源的访问.访问GIS资源的权限只能分配给角色.单独的用户只能通过从 ...

  2. Netty-EventLoop

    1. public interface EventLoop extends EventExecutor, EventLoopGroup 2. public interface EventExecuto ...

  3. 聚合不应出现在 UPDATE 语句的集合列表中

    修改语句: update A set WZCount=ISNULL(WZCount,0)+(select SUM(WZCount) from T_PM_OutStock_SUB where Mater ...

  4. Angular-cli 构建应用的一些配置

    Angular-cli 构建应用 的一些配置 标签(空格分隔): Angular 直接使用 ng build --prod --build-optimizer --base-href=/ 来发布 ba ...

  5. OFFICE_EXCEL_Combine text from two or more cells into one cell.

    Excel   Enter and format data   Layout   Combine text from two or more cells into one cell Combine t ...

  6. 【[AH2017/HNOI2017]礼物】

    题目 又是我不会做的题了 看看柿子吧 \[\sum(a_i+c-b_i)^2\] 最小化这个柿子 之所以不写下标是因为我们这个\(\{a\},\{b\}\)可以循环同构 那就开始化吧 \[\sum(a ...

  7. 添加模糊效果demo

    添加模糊效果demo: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> & ...

  8. 深入 Struts2 的配置 - 处理多个请求-处理请求结果-模型驱动-异常机制

    转:http://www.java3z.com/cwbwebhome/article/article2/2938.html?id=1631 本部分主要介绍struts.xml的常用配置. 1.1.   ...

  9. VMware虚拟机修改BIOS启动项

    vmware默认是硬盘启动,要进bios里面设置成开机的启动顺序,要将光盘设置成第一启动项.但vm的开机画面比笔记本的还要快很多,基本都在1s内的,想进入 bios里面也有难度.. 对于网上说的开vm ...

  10. Linux 下的多线程编程(1)

    #include<stdio.h> #include<pthread.h> #include<string.h> #include<sys/time.h> ...