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

看本章之前可以先看看第七章 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 -->
2         <dependency>
3             <groupId>com.squareup.okhttp</groupId>
4             <artifactId>okhttp</artifactId>
5             <version>2.7.5</version>
6         </dependency>

2.2、application-dev.properties

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

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

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的更多相关文章

  1. 第十六章 springboot + OKhttp + String.format

    模拟浏览器向服务器发送请求四种方式: jdk原生的Http包下的一些类 httpclient(比较原始,不怎么用了):第一章 HttpClient的使用 Okhttp(好用,推荐) retrofit( ...

  2. SpringBoot | 第二十六章:邮件发送

    前言 讲解了日志相关的知识点后.今天来点相对简单的,一般上,我们在开发一些注册功能.发送验证码或者订单服务时,都会通过短信或者邮件的方式通知消费者,注册或者订单的相关信息.而且基本上邮件的内容都是模版 ...

  3. Gradle 1.12 翻译——第十六章. 使用文件

    有关其它已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或訪问:http://gradledoc.qiniudn.com ...

  4. Gradle 1.12用户指南翻译——第二十六章. War 插件

    其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://g ...

  5. 【C++】《C++ Primer 》第十六章

    第十六章 模板与泛型编程 面向对象编程和泛型编程都能处理在编写程序时不知道类型的情况. OOP能处理类型在程序允许之前都未知的情况. 泛型编程在编译时就可以获知类型. 一.定义模板 模板:模板是泛型编 ...

  6. 《Linux命令行与shell脚本编程大全》 第十六章 学习笔记

    第十六章:创建函数 基本的脚本函数 创建函数 1.用function关键字,后面跟函数名 function name { commands } 2.函数名后面跟空圆括号,标明正在定义一个函数 name ...

  7. 第十六章——处理锁、阻塞和死锁(3)——使用SQLServer Profiler侦测死锁

    原文:第十六章--处理锁.阻塞和死锁(3)--使用SQLServer Profiler侦测死锁 前言: 作为DBA,可能经常会遇到有同事或者客户反映经常发生死锁,影响了系统的使用.此时,你需要尽快侦测 ...

  8. CSS3秘笈复习:十三章&十四章&十五章&十六章&十七章

    第十三章 1.在使用浮动时,源代码的顺序非常重要.浮动元素的HTML必须处在要包围它的元素的HTML之前. 2.清楚浮动: (1).在外围div的底部添加一个清除元素:clear属性可以防止元素包围浮 ...

  9. Gradle 1.12用户指南翻译——第三十六章. Sonar Runner 插件

    本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...

随机推荐

  1. form表单的enctype属性

    ①application/x-www-form-urlencoded : 数据被编码为名称/值对. ②multipart/form-data : 数据被编码为一条消息,页上的每个控件对应消息中的一个部 ...

  2. CentOS工作内容(四)主机禁ping

    CentOS工作内容(四)主机禁ping 用到的快捷键 tab 自动补齐(有不知道的吗) ctrl+a 移动到当前行的开头(a ahead) ctrl+u 删除(剪切)此处至开始所有内容 vim 末行 ...

  3. 部署MyEclipse及Tomcat服务器

     修改MySQL文件工程密码 Tomcat6.12\webapps\SmsService\WEB-INF\applicationContext.xml目录下的数据库密码 <property na ...

  4. 使用spring boot,gradle,idea,js,html创建一个小的前后端程序

    1:配置build.gradle,添加依赖等 buildscript { repositories { mavenCentral() } dependencies { classpath('org.s ...

  5. matlab 怎么建立结构体数组?

    https://zhidao.baidu.com/question/537198107.html 怎么定义一个结构体数组,使数组的每个元素是一个结构体变量.像这样:a=(1,2)a(1)=struct ...

  6. Lintcode: k Sum II

    Given n unique integers, number k (1<=k<=n) and target. Find all possible k integers where the ...

  7. Summary: Difference between null and empty String

    String s1 = ""; means that the empty String is assigned to s1. In this case, s1.length() i ...

  8. [转]Mac Appium环境安装

    原文:https://blog.csdn.net/dongqiushan/article/details/53326518 1.安装JDK; 2.安装Android SDK; 3.安装brew; 4. ...

  9. 隐马尔科夫模型(HMM)学习笔记二

    这里接着学习笔记一中的问题2,说实话问题2中的Baum-Welch算法编程时矩阵转换有点烧脑,开始编写一直不对(编程还不熟练hh),后面在纸上仔细推了一遍,由特例慢慢改写才运行成功,所以代码里面好多处 ...

  10. MyBatis学习笔记(六)——调用存储过程

    转自孤傲苍狼的博客:http://www.cnblogs.com/xdp-gacl/p/4270352.html 一.提出需求 查询得到男性或女性的数量, 如果传入的是0就女性否则是男性 二.准备数据 ...