当前位置: 首页 > news >正文

第十六章 springboot + OKhttp + String.format

模拟浏览器向服务器发送请求四种方式:

  • jdk原生的Http包下的一些类
  • httpclient(比较原始,不怎么用了):第一章 HttpClient的使用
  • Okhttp(好用,推荐)
  • retrofit(好用,推荐),用法:第七章 springboot + retrofit

看本章之前可以先看看第七章 springboot + retrofit

1、myboot2项目

1.1、application.properties

1 server.port=8081
View Code

注意:指定服务器启动端口的有三种方式

  • 在application.properties文件中配置server.port = xxx(xxx为端口,eg.8081)(最推荐)
  • 启动类实现EmbeddedServletContainerCustomizer接口,并重写其方法,参考第七章 springboot + retrofit
  • 打好jar后,"java -jar xx.jar --server.port=8081"

1.2、pom.xml

1         <!-- import lombok -->
2         <dependency>
3             <groupId>org.projectlombok</groupId>
4             <artifactId>lombok</artifactId>
5             <version>1.16.8</version>
6             <scope>provided</scope>
7         </dependency>
View Code

1.3、com.xxx.secondboot.domain.Hotel

 1 package com.xxx.secondboot.domain;
 2 
 3 import lombok.AllArgsConstructor;
 4 import lombok.Getter;
 5 import lombok.NoArgsConstructor;
 6 import lombok.Setter;
 7 
 8 @Getter @Setter
 9 @AllArgsConstructor @NoArgsConstructor
10 public class Hotel {
11     private int id;
12     private String hotelname;
13 }
View Code

1.4、com.xxx.secondboot.web.HotelController

 1 @RestController
 2 @RequestMapping("/hotel")
 3 @Api("HotelController相关api")
 4 public class HotelController {
 5 
 6     @ApiOperation("获取酒店Hotel信息:getHotelInfo")
 7     @RequestMapping(value="/getHotelInfo",method=RequestMethod.GET)
 8     public Hotel getHotelInfo(@RequestParam("id") int id, @RequestParam("name") String name) {
 9         return new Hotel(id, name);
10     }
11 }
View Code

说明:上边的接口,就是准备被调用的接口。

 

2、myboot1项目

2.1、pom.xml

1         <!-- 引入okhttp -->
2         <dependency>
3             <groupId>com.squareup.okhttp</groupId>
4             <artifactId>okhttp</artifactId>
5             <version>2.7.5</version>
6         </dependency>
View Code

2.2、application-dev.properties

1 service.hotel.url = http://localhost:8081/hotel/getHotelInfo?id=%d&name=%s
View Code

注意:这里使用了String.format()特性,使用指定符号作为占位符进行占位。

  • 关于占位符的类型参考:http://blog.csdn.net/lonely_fireworks/article/details/7962171
  • 一定要注意,是%d,而不是d%

2.3、application.properties

1 spring.profiles.active=dev
View Code

2.4、com.xxx.firstboot.config.OkHttpClientConfig

 1 package com.xxx.firstboot.config;
 2 
 3 import org.springframework.context.annotation.Bean;
 4 import org.springframework.context.annotation.Configuration;
 5 
 6 import com.squareup.okhttp.OkHttpClient;
 7 
 8 @Configuration
 9 public class OkHttpClientConfig {
10 
11     @Bean
12     public OkHttpClient okHttpClient(){
13         return new OkHttpClient();
14     }
15 }
View Code

说明:建立OkHttpClient单例。

2.5、com.xxx.firstboot.web.AddressController

 1     @RequestMapping(value = "/testokhttp", method = RequestMethod.GET)
 2     public String testokhttp(@RequestParam("id") int id, @RequestParam("name") String name) {
 3         String url = String.format(HOTEL_URL, id, name);
 4         try {
 5             Request request = new Request.Builder().url(url).build();
 6             Response response = okHttpClient.newCall(request).execute();
 7             String result = response.body().string();
 8             LOGGER.debug("testokhttp成功,url:'{}',result:'{}'", url, result);
 9             return result;
10         } catch (IOException e) {
11             LOGGER.error("testokhttp失败,url:'{}'", url);
12             e.printStackTrace();
13         }
14         return "";
15     }
View Code

说明:这里只是同步get方式,关于okhttp的其他用法,参考:http://www.cnblogs.com/ct2011/p/4001708.html

补充:其实上边这种写法还是有问题的,忘记关闭资源,最终代码如下:

 1     @RequestMapping(value = "/testokhttp", method = RequestMethod.GET)
 2     public String testokhttp(@RequestParam("id") int id, @RequestParam("name") String name) {
 3         String url = String.format(HOTEL_URL, id, name);
 4         Response response = null;
 5         try {
 6             Request request = new Request.Builder().url(url).build();
 7             response = okHttpClient.newCall(request).execute();
 8             String result = response.body().string();
 9             LOGGER.debug("testokhttp成功,url:'{}',result:'{}'", url, result);
10             return result;
11         } catch (IOException e) {
12             LOGGER.error("testokhttp失败,url:'{}'", url);
13             e.printStackTrace();
14         }finally {
15             if(response.body()!=null){
16                 try {
17                     response.body().close();//一定要关闭,不然会泄露资源
18                 } catch (IOException e) {
19                     e.printStackTrace();
20                 }
21             }
22         }
23         return "";
24     }
View Code

2.6、logback.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <configuration>
 3     <include resource="org/springframework/boot/logging/logback/base.xml" />
 4     <!-- 1、logger 
 5          属性: 
 6             1)name:用来指定受此logger约束的某一个包或者具体的某一个类 
 7             2)level:用来设置打印级别,大小写无关(最常用的几种):DEBUG, INFO, WARN, ERROR 
 8          2、 
 9     -->
10     <!-- <logger name="org.springframework.web" level="DEBUG" /> -->
11 
12     <!-- mybatis日志打印 -->
13     <!-- <logger name="com.ibatis" level="DEBUG" /> -->
14     <!-- <logger name="com.ibatis.common.jdbc.SimpleDataSource" level="DEBUG" /> -->
15     <!-- <logger name="com.ibatis.common.jdbc.ScriptRunner" level="DEBUG" /> -->
16     <!-- <logger name="com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate" level="DEBUG" /> -->
17     
18     <!-- <logger name="java.sql.Connection" level="DEBUG" /> -->
19     <!-- <logger name="java.sql.Statement" level="DEBUG" /> -->
20     <!-- <logger name="java.sql.PreparedStatement" level="DEBUG" /> -->
21     <!-- 这一句至关重要如果没有,就无法输出sql语句 -->
22     <logger name="com.xxx.firstboot.mapper" level="DEBUG"></logger>
23     <logger name="com.xxx.firstboot.web" level="DEBUG"></logger>
24  </configuration>
View Code

相关文章:

  • 移动办公新体验--Windows to go
  • nginx 反向代理aws上服务的问题排查
  • python开发_tkinter_图片操作
  • 程序猿眼中的高并发
  • Android系统移植与调试之-------如何修改Android自带的apk出现一圈圈类似鸡蛋的花纹...
  • ChemDraw中如何输入化学式分隔点
  • 开源原型设计工具Indigo Studio发布v2.0 全面支持HTML5
  • 点击文字选中选框
  • IOS系统中各种设置项的URL链接
  • 学习ubuntu远程桌面(二):远程桌面会话管理
  • UNIX环境高级编程--高级I/O(三)
  • java类加载器行为[笔记]
  • 两种不同的重置样式方法(normalize.css)
  • windows平台下cocos2d-x-3.0beta2创建新项目
  • 【桌面虚拟化】之三 Persistent vs NonP
  • 深入了解以太坊
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • 《Java编程思想》读书笔记-对象导论
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • Angular6错误 Service: No provider for Renderer2
  • git 常用命令
  • github指令
  • Intervention/image 图片处理扩展包的安装和使用
  • JavaScript创建对象的四种方式
  • PHP 小技巧
  • Python实现BT种子转化为磁力链接【实战】
  • React组件设计模式(一)
  • Sequelize 中文文档 v4 - Getting started - 入门
  • Terraform入门 - 1. 安装Terraform
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • windows下mongoDB的环境配置
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 给Prometheus造假数据的方法
  • 前端面试题总结
  • 强力优化Rancher k8s中国区的使用体验
  • 小程序button引导用户授权
  • raise 与 raise ... from 的区别
  • 阿里云服务器如何修改远程端口?
  • (bean配置类的注解开发)学习Spring的第十三天
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (java)关于Thread的挂起和恢复
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (五)c52学习之旅-静态数码管
  • (一) springboot详细介绍
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • (转)jdk与jre的区别
  • (轉貼) 資訊相關科系畢業的學生,未來會是什麼樣子?(Misc)
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献
  • .NET与java的MVC模式(2):struts2核心工作流程与原理
  • /var/log/cvslog 太大
  • @Transaction注解失效的几种场景(附有示例代码)