第十六章 springboot + OKhttp + String.format

2016-12-30 09:54:59来源:oschina作者:abcijkxyz人点击

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

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

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


1、myboot2项目


1.1、application.properties


1 server.port=8081View 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
2
3org.projectlombok
4lombok
51.16.8
6provided
7
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 @Setter9 @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 @RestController2 @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) {9return new Hotel(id, name); 10} 11 }View Code

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

2、myboot1项目


2.1、pom.xml


1
2
3com.squareup.okhttp
4okhttp
52.7.5
6
View Code

2.2、application-dev.properties


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

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

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

2.3、application.properties


1 spring.profiles.active=devView 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 @Configuration9 public class OkHttpClientConfig { 10
11@Bean 12 public OkHttpClient okHttpClient(){ 13return 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) {3String url = String.format(HOTEL_URL, id, name);4try {5Request request = new Request.Builder().url(url).build();6Response response = okHttpClient.newCall(request).execute();7String result = response.body().string();8LOGGER.debug("testokhttp成功,url:'{}',result:'{}'", url, result);9return result; 10} catch (IOException e) { 11LOGGER.error("testokhttp失败,url:'{}'", url); 12e.printStackTrace(); 13} 14return ""; 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) {3String url = String.format(HOTEL_URL, id, name);4Response response = null;5try {6Request request = new Request.Builder().url(url).build();7response = okHttpClient.newCall(request).execute();8String result = response.body().string();9LOGGER.debug("testokhttp成功,url:'{}',result:'{}'", url, result); 10return result; 11} catch (IOException e) { 12LOGGER.error("testokhttp失败,url:'{}'", url); 13e.printStackTrace(); 14}finally { 15if(response.body()!=null){ 16 try { 17 response.body().close();//一定要关闭,不然会泄露资源
18 } catch (IOException e) { 19e.printStackTrace(); 20} 21} 22} 23return ""; 24 }View Code

2.6、logback.xml


1 <?xml version="1.0" encoding="UTF-8"?>
2
3
4
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
View Code

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台