第十六章 springboot + OKhttp + String.format
模拟浏览器向服务器发送请求四种方式:
- jdk原生的Http包下的一些类
- httpclient(比较原始,不怎么用了):第一章 HttpClient的使用
- Okhttp(好用,推荐)
- retrofit(好用,推荐),用法:第七章 springboot + retrofit
看本章之前可以先看看第七章 springboot + retrofit
1、myboot2项目
1.1、application.properties
server.port=8081
注意:指定服务器启动端口的有三种方式
- 在application.properties文件中配置server.port = xxx(xxx为端口,eg.8081)(最推荐)
- 启动类实现EmbeddedServletContainerCustomizer接口,并重写其方法,参考第七章 springboot + retrofit
- 打好jar后,"java -jar xx.jar --server.port=8081"
1.2、pom.xml
<!-- import lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.8</version>
<scope>provided</scope>
</dependency>
1.3、com.xxx.secondboot.domain.Hotel
package com.xxx.secondboot.domain; import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter; @Getter @Setter
@AllArgsConstructor @NoArgsConstructor
public class Hotel {
private int id;
private String hotelname;
}
1.4、com.xxx.secondboot.web.HotelController
@RestController
@RequestMapping("/hotel")
@Api("HotelController相关api")
public class HotelController { @ApiOperation("获取酒店Hotel信息:getHotelInfo")
@RequestMapping(value="/getHotelInfo",method=RequestMethod.GET)
public Hotel getHotelInfo(@RequestParam("id") int id, @RequestParam("name") String name) {
return new Hotel(id, name);
}
}
说明:上边的接口,就是准备被调用的接口。
2、myboot1项目
2.1、pom.xml
<!-- 引入okhttp -->
<dependency>
<groupId>com.squareup.okhttp</groupId>
<artifactId>okhttp</artifactId>
<version>2.7.5</version>
</dependency>
2.2、application-dev.properties
service.hotel.url = http://localhost:8081/hotel/getHotelInfo?id=%d&name=%s
注意:这里使用了String.format()特性,使用指定符号作为占位符进行占位。
- 关于占位符的类型参考:http://blog.csdn.net/lonely_fireworks/article/details/7962171
- 一定要注意,是%d,而不是d%
2.3、application.properties
spring.profiles.active=dev
2.4、com.xxx.firstboot.config.OkHttpClientConfig
package com.xxx.firstboot.config; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import com.squareup.okhttp.OkHttpClient; @Configuration
public class OkHttpClientConfig { @Bean
public OkHttpClient okHttpClient(){
return new OkHttpClient();
}
}
说明:建立OkHttpClient单例。
2.5、com.xxx.firstboot.web.AddressController
@RequestMapping(value = "/testokhttp", method = RequestMethod.GET)
public String testokhttp(@RequestParam("id") int id, @RequestParam("name") String name) {
String url = String.format(HOTEL_URL, id, name);
try {
Request request = new Request.Builder().url(url).build();
Response response = okHttpClient.newCall(request).execute();
String result = response.body().string();
LOGGER.debug("testokhttp成功,url:'{}',result:'{}'", url, result);
return result;
} catch (IOException e) {
LOGGER.error("testokhttp失败,url:'{}'", url);
e.printStackTrace();
}
return "";
}
说明:这里只是同步get方式,关于okhttp的其他用法,参考:http://www.cnblogs.com/ct2011/p/4001708.html
补充:其实上边这种写法还是有问题的,忘记关闭资源,最终代码如下:
@RequestMapping(value = "/testokhttp", method = RequestMethod.GET)
public String testokhttp(@RequestParam("id") int id, @RequestParam("name") String name) {
String url = String.format(HOTEL_URL, id, name);
Response response = null;
try {
Request request = new Request.Builder().url(url).build();
response = okHttpClient.newCall(request).execute();
String result = response.body().string();
LOGGER.debug("testokhttp成功,url:'{}',result:'{}'", url, result);
return result;
} catch (IOException e) {
LOGGER.error("testokhttp失败,url:'{}'", url);
e.printStackTrace();
}finally {
if(response.body()!=null){
try {
response.body().close();//一定要关闭,不然会泄露资源
} catch (IOException e) {
e.printStackTrace();
}
}
}
return "";
}
2.6、logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/base.xml" />
<!-- 1、logger
属性:
1)name:用来指定受此logger约束的某一个包或者具体的某一个类
2)level:用来设置打印级别,大小写无关(最常用的几种):DEBUG, INFO, WARN, ERROR
2、
-->
<!-- <logger name="org.springframework.web" level="DEBUG" /> --> <!-- mybatis日志打印 -->
<!-- <logger name="com.ibatis" level="DEBUG" /> -->
<!-- <logger name="com.ibatis.common.jdbc.SimpleDataSource" level="DEBUG" /> -->
<!-- <logger name="com.ibatis.common.jdbc.ScriptRunner" level="DEBUG" /> -->
<!-- <logger name="com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate" level="DEBUG" /> --> <!-- <logger name="java.sql.Connection" level="DEBUG" /> -->
<!-- <logger name="java.sql.Statement" level="DEBUG" /> -->
<!-- <logger name="java.sql.PreparedStatement" level="DEBUG" /> -->
<!-- 这一句至关重要如果没有,就无法输出sql语句 -->
<logger name="com.xxx.firstboot.mapper" level="DEBUG"></logger>
<logger name="com.xxx.firstboot.web" level="DEBUG"></logger>
</configuration>
第十六章 springboot + OKhttp + String.format的更多相关文章
- 【第十六章】 springboot + OKhttp + String.format
模拟浏览器向服务器发送请求四种方式: jdk原生的Http包下的一些类 httpclient(比较原始,不怎么用了):第一章 HttpClient的使用 Okhttp(好用,推荐) retrofit( ...
- SpringBoot | 第二十六章:邮件发送
前言 讲解了日志相关的知识点后.今天来点相对简单的,一般上,我们在开发一些注册功能.发送验证码或者订单服务时,都会通过短信或者邮件的方式通知消费者,注册或者订单的相关信息.而且基本上邮件的内容都是模版 ...
- Gradle 1.12 翻译——第十六章. 使用文件
有关其它已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或訪问:http://gradledoc.qiniudn.com ...
- Gradle 1.12用户指南翻译——第二十六章. War 插件
其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://g ...
- 【C++】《C++ Primer 》第十六章
第十六章 模板与泛型编程 面向对象编程和泛型编程都能处理在编写程序时不知道类型的情况. OOP能处理类型在程序允许之前都未知的情况. 泛型编程在编译时就可以获知类型. 一.定义模板 模板:模板是泛型编 ...
- 《Linux命令行与shell脚本编程大全》 第十六章 学习笔记
第十六章:创建函数 基本的脚本函数 创建函数 1.用function关键字,后面跟函数名 function name { commands } 2.函数名后面跟空圆括号,标明正在定义一个函数 name ...
- 第十六章——处理锁、阻塞和死锁(3)——使用SQLServer Profiler侦测死锁
原文:第十六章--处理锁.阻塞和死锁(3)--使用SQLServer Profiler侦测死锁 前言: 作为DBA,可能经常会遇到有同事或者客户反映经常发生死锁,影响了系统的使用.此时,你需要尽快侦测 ...
- CSS3秘笈复习:十三章&十四章&十五章&十六章&十七章
第十三章 1.在使用浮动时,源代码的顺序非常重要.浮动元素的HTML必须处在要包围它的元素的HTML之前. 2.清楚浮动: (1).在外围div的底部添加一个清除元素:clear属性可以防止元素包围浮 ...
- Gradle 1.12用户指南翻译——第三十六章. Sonar Runner 插件
本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...
随机推荐
- mysql 解除正在死锁的状态
转自:http://blog.csdn.net/hotdust/article/details/51524469 from: http://www.2cto.com/database/201303/1 ...
- 《Android源码设计模式》--单例模式
No1: 懒汉单例模式优缺点分析 public class Singleton{ private static Singleton instance; private Singleton(){} pu ...
- win10 远程桌面远程电脑时每次要输入密码及身份验证错误,要求的函数不受支持问题解决
解决以前每次远程时能能记住密码,更新系统补丁后现在每次登录要输入密码了及远程时提示身份验证错误,要求的函数不受支持问题 解决方法一.卸载更新安装的新补丁,远程桌面正常,能记住密码 解决方法二.修改注册 ...
- java中int和Integer比较
java中int和Integer比较 一,类型区别 我们知道java中由两种数据类型,即基本类型和对象类型,int就是基本数据类型,而Integer是一个class,也习惯把Integer叫做int的 ...
- Tensorflow学习:(三)神经网络优化
一.完善常用概念和细节 1.神经元模型: 之前的神经元结构都采用线上的权重w直接乘以输入数据x,用数学表达式即,但这样的结构不够完善. 完善的结构需要加上偏置,并加上激励函数.用数学公式表示为:.其中 ...
- [BZOJ5338][TJOI2018]xor(可持久化Trie)
可持久化Trie模板题. 建两种可持久化Trie,每个点两棵,一棵对DFS求前缀和,一棵对祖先求前缀和. 或者树剖,不好写多少还多个log. #include<cstdio> #inclu ...
- Codeforces 1090J $kmp+hash+$二分
题意 给出两个字符串\(s\)和\(t\),设\(S\)为\(s\)的任意一个非空前缀,\(T\)为\(t\)的任意一个非空前缀,问\(S+T\)有多少种不同的可能. Solution 看了一圈,感觉 ...
- [BZOJ2716]天使玩偶
[BZOJ2716]天使玩偶 题目大意: 一个平面直角坐标系,坐标\(1\le x,y\le10^6\).\(n(n\le10^6)\)次操作,操作包含以下两种: 新增一个点\((x,y)\): 询问 ...
- Xcode 几个图标解释
File.让您指定串联图的常规信息. Quick Help.提供有关对象的实用文稿. Identity.让您指定对象的自定类并定义其辅助功能属性. Attributes.让您自定对象的可视化属性. S ...
- centos7安装apache 新手入门 图文教程
操作系统 64位CentOS Linux release 7.2.1511 (Core) 下载apache相关软件 1.apr和apr-util,下载地址: http://apr.apache.org ...