1 回调

1.1 回调函数

1.1.1 回调的原理图

说明:在架构设计中,回调的机制经常会被使用,课下自行学习.

1.2 JSON的数据结构

1.2.1 JSON官网介绍

1.2.2 Object格式

例子:{“key1”:”value1”,key2:”value2”}

User(id.name.age)

1.2.3 数组格式

例子:[“value1”,”value2”,”value3”]

1.2.4 复杂格式

说明:将上述2中简单JSON格式进行无限层级的嵌套.最终形成的

例子 [1,{id:1,name:”tom”,age:18}]

{id:1,name:"tom",array:[1,2,3,4,5,{array:[22,33,44,55]}]}

1.3 JSONP调用调用

1.3.1 流程图

1.4 缓存操作

1.4.1 编辑Controller

/*** 利用工具类直接返回JSONP的对象 callback({JSON})

*@paramcallback

*@return

*/@RequestMapping("/web/itemcat/all")

@ResponseBodypublicObject findItemCat(String callback){

ItemCatResult itemCatresult=itemCatService.findCacheItemCatAll();//负责JSONP对象返回 构造方法中添加返回的数据

MappingJacksonValue jacksonValue =

newMappingJacksonValue(itemCatresult);//设定返回值方法

jacksonValue.setJsonpFunction(callback);returnjacksonValue;

}

View Code

1.4.2 编辑Service

/*** 1.查询时应该先查询缓存

* 2.如果缓存中没有缓存数据则执行业务操作查询数据

* 3.将查询结果返回,将查询的结果存入缓存中

* 4.如果缓存中含有该数据

* 5.将缓存数据转化对象返回.满足编程的规范

*@return

*/

//实现三级商品分类的缓存操作

@OverridepublicItemCatResult findCacheItemCatAll(){

String key= "ITEM_CAT_ALL";

String jsonData=jedisCluster.get(key);try{//判断数据是否为空

if(StringUtils.isEmpty(jsonData)){

ItemCatResult itemCatResult=findItemCatAll();//将对象转化为JSON串

String restJSON =objectMapper.writeValueAsString(itemCatResult);//将数据存入redis中

jedisCluster.set(key, restJSON);returnitemCatResult;

}else{

ItemCatResult itemCatResult=objectMapper.readValue(jsonData, ItemCatResult.class);returnitemCatResult;

}

}catch(Exception e) {

e.printStackTrace();return null;

}

View Code

2 商品详细页面展现

2.1 HttpClent

2.1.1 介绍

总结:在业务层代码中,通过httpClient的方式可以模拟浏览器发出的Http请求.

2.1.2 HttpClient和JSONP的差别

区别:

1.发送请求的位置不同.

JSONP的请求是由浏览器发出的.

httpClient请求是由业务层模拟http协议发出的

2.浏览器监控不同

JSONP的调用浏览器可以完全的监控.

HttpClient的方式浏览器不能监控其调用.对于业务的操作一般都会使用httpClient

3.返回值处理不同

1.JSONP的处理是通过页面的JS的方式解析返回结果

2.HttpClient是通过业务代码的方式解析返回值结果.

2.2 入门案例

2.2.1 Jar包引入

org.apache.httpcomponents

httpclient

${httpclient.version}

2.2.2 Get请求

//模拟get请求

@Test

public void testGet() throws ClientProtocolException, IOException{

//1.创建httpCLient对象

CloseableHttpClient httpClient

= HttpClients.createDefault();

//2.定义uri

String uri = "https://item.jd.com/1607218.html";

//3.定义请求方式

HttpGet httpGet = new HttpGet(uri);

//4.发出请求

CloseableHttpResponse response

= httpClient.execute(httpGet);

//判断请求是否正确

if(response.getStatusLine().getStatusCode() == 200){

//获取请求内容

String result =

EntityUtils.toString(response.getEntity()) ;

System.out.println("打印实体信息"+result);

}

}

View Code

2.2.3 Post提交

@Test

public void testPost() throws ClientProtocolException, IOException{

//获取httpclient对象

CloseableHttpClient client =

HttpClients.createDefault();

//定义url

String url = "http://www.tmooc.cn/web/index_new.html?tedu";

//定义Post请求方式

HttpPost httpPost = new HttpPost(url);

//Entity中需要设定post中提交的参数

//UrlEncodedFormEntity entity = new UrlEncodedFormEntity(parameters)

//httpPost.setEntity(entity);

CloseableHttpResponse httpResponse

= client.execute(httpPost);

//判断数据是否正确

if(httpResponse.getStatusLine().getStatusCode() == 200){

String msg = EntityUtils.toString(httpResponse.getEntity());

System.out.println(msg);

}

}

View Code

2.3 Spring整合HttpClient

2.3.1 导入Spring配置文件

View Code

2.3.2 导入properties文件

Spring引入配置文件

2.3.3 编辑Get请求

Get请求

Get请求/*** 说明:

* 编辑工具类时需要处理2中类型的请求 get post

* 参数介绍:

* addUser?id:1&name=tom&age=18

* 定义url 确定访问的路径

* 定义参数集合 Map.指定参数的类型都是String

* 定义字符集 encode=utf-8

*

* 方法介绍

* 根据不同的用户需求,重载多个方法*/

/*** 编辑思路:

* Url:findItem?id=1&name=tom

* 1.判断是否包含参数,如果包含参数应该将参数进行动态的拼接

* 2.判断是否指定字符集编码 如果没有指定则设置默认值UTF-8

* 3.通过httpClient对象发起http请求

* 4.判断返回值是否有效

* 5.将结果返回

*@paramurl

*@paramparams

*@paramcharset

*@return*@throwsURISyntaxException*/

public String doGet(String uri,Map params,String charset) throwsURISyntaxException{//1.判断是否含有参数 Url:findItem?id=1&name=tom

URIBuilder builder = newURIBuilder(uri);if(params !=null){//整理get提交参数

for (Map.Entryparam :params.entrySet()) {

builder.addParameter(param.getKey(), param.getValue());

}//Uri:findItem?id=1&name=tom&age=18

System.out.println("编辑uri结果:!!!!"+builder.toString());

uri=builder.toString();

}//判断字符集编码

if(StringUtils.isEmpty(charset)){

charset= "UTF-8";

}//定义Get请求对象

HttpGet httpGet = newHttpGet(uri);

httpGet.setConfig(requestConfig);//发送请求

try{

CloseableHttpResponse httpResponse=httpClient.execute(httpGet);//判断请求是否正确

if(httpResponse.getStatusLine().getStatusCode() == 200){//result是远程返回的JSON数据

String result =EntityUtils.toString(httpResponse.getEntity(),charset);returnresult;

}

}catch(Exception e) {

e.printStackTrace();

}return null;

}

View Code

2.3.4 编辑Post请求

Post请求

Post请求/** 1.doPost请求方式和doget类似

* 2.doPost中的参数传递借助form表单.

*

* 编码步骤:

* 1.定义请求的对象 httpPost()

* 2.判断是否含有参数,如果含有参数需要表单的赋值

* 3.将form表单的参数赋值给post请求

**/

public String doPost(String uri,Map params,String charset) throwsUnsupportedEncodingException{//定义post提交方式

HttpPost httpPost = newHttpPost(uri);if(StringUtils.isEmpty(charset)){

charset= "UTF-8";

}//判断参数是否为空

if(params !=null){//定义参数提交的集合

List parameters =

new ArrayList();//为参数赋值

for (Map.Entryparam : params.entrySet()) {

BasicNameValuePair nameValuePair=

newBasicNameValuePair(param.getKey(), param.getValue());

parameters.add(nameValuePair);

}

UrlEncodedFormEntity entity=

newUrlEncodedFormEntity(parameters, charset);//为post请求赋值

httpPost.setEntity(entity);

}try{

CloseableHttpResponse response=httpClient.execute(httpPost);//判断返回值是否正确

if(response.getStatusLine().getStatusCode() == 200){

String result=EntityUtils.toString(response.getEntity(),charset);returnresult;

}

}catch(Exception e) {

e.printStackTrace();

}return null;

}

View Code

2.4 商品详细实现

2.4.1 页面分析

说明:当查询某一个商品时,会发送一个请求,并且采用resuFul风格进行数据的提交

2.4.2 HttpClient调用流程图

说明:

2.调用客户端Service

3.通过httpClient进行跨域访问

4.服务端Controller接收请求并且处理

5.业务层代码获取Item数据

2.4.3 分析页面

说明:根据访问地址编辑Controller

2.4.4 编辑客户端Controller

说明:controller拦截客户端请求

/**

* 将来的页面是否需要人为的指定

* @param itemId

* @return

*/

@RequestMapping("/{itemId}")

public String findItemById(@PathVariable Long itemId,Model model){

Item item = itemService.findItemById(itemId);

model.addAttribute("item", item);

return "item";

}

2.4.5 调用客户端Service

/**

* 经过京淘前台的业务层,去访问后台的业务代码?

* 解决策略:跨域

* 问题:在业务层中不能采用JSONP的形式进行跨域调用

* 解决:采用HttpClient方式进行调用

*

*/

@Override

public Item findItemById(Long itemId) {

String uri = "http://manage.jt.com/web/item/findItemById/"+itemId;

try {

String jsonData = httpClientService.doGet(uri);

if(!StringUtils.isEmpty(jsonData)){

//需要将JSON串转化为Item对象

Item item =

objectMapper.readValue(jsonData, Item.class);

return item;

}

} catch (Exception e) {

e.printStackTrace();

}

return null;

}

2.4.6 编辑后端Controller

说明:根据客户端发出的请求,Controller接收请求

//http://manage.jt.com/web/item/findItemById/"+itemId

@RequestMapping("/findItemById/{itemId}")

@ResponseBody

public Item findItemById(@PathVariable Long itemId){

//根据Id获取后台Item数据

Item item = itemService.findItemById(itemId);

return item;

}

2.4.7 编辑服务端Service

说明:根据ItemId获取Item数据并且返回

@Override

public Item findItemById(Long itemId) {

Item item = itemMapper.selectByPrimaryKey(itemId);

return item;

}

2.5 商品信息实现缓存

2.5.1 前台实现缓存处理

2.6 维护redis中数据的一致性

2.6.1 后台数据更新维护

说明:当后台数据进行更新或者删除操作时,需要进行redis内存的数据维护,策略将redis中的更新数据直接删除.

java httpclient 跨域_13、HttpClient服务器跨域请求相关推荐

  1. 【愚公系列】2022年01月 Java教学课程 71-自建HTTP服务器解析浏览器请求案例

    文章目录 一.自建HTTP服务器解析浏览器请求案例 1.环境搭建 2.获取请求信息并解析 3.给浏览器响应数据 4.代码优化 一.自建HTTP服务器解析浏览器请求案例 1.环境搭建 实现步骤 编写Ht ...

  2. ad域时间源配置_AD域控NTP服务器修改 域控时间与互联网同步

    访客您好,登录后可看更多精彩内容!发帖.回复积分还可换实物奖品哦,还在犹豫什么,赶紧注册登录吧! 您需要 登录 才可以下载或查看,没有帐号?立即注册 x 本帖最后由 bijiafeng 于 2020- ...

  3. java服务端 json接口_java以json格式向后台服务器接口发送请求的实例

    java以json格式向后台服务器接口发送请求的实例 发布于 2021-1-14| 复制链接 下面小妖就为大家分享一篇java以json格式向后台服务器接口发送请求的实例,具有很好的参考价值,希望对大 ...

  4. 使用Httpclient来替代客户端的jsonp跨域解决方案

    最近接手一个项目,新项目需要调用老项目的接口,但是老项目和新项目不再同一个域名下,所以必须进行跨域调用了,但是老项目又不能进行任何修改,所以jsonp也无法解决了,于是想到了使用了Httpclient ...

  5. Ajax跨域访问Tomcat服务器

    在学习jQuery的时候进行到AJax时,需要与服务器进行交互练习.我毫不犹豫的打开了我的Tomcat服务器运行起来,并使用普通的ajax方法访问运行中的服务器网址的时候,发现 XMLHttpRequ ...

  6. 新版vue-cli模板下本地开发环境使用node服务器跨域

    背景 我们都知道浏览器有一个既核心也最基本的安全功能,即同源策略.同源分别是:协议,域名,端口.如果浏览器访问服务器不同源的话,就会访问不到数据.那开发中常常访问的服务器不同源,那么可以借助一个服务器 ...

  7. vue读取服务器文件跨域,新版vue-cli模板下本地开发环境使用node服务器跨域的方法...

    背景 我们都知道浏览器有一个既核心也最基本的安全功能,即同源策略.同源分别是:协议,域名,端口.如果浏览器访问服务器不同源的话,就会访问不到数据.那开发中常常访问的服务器不同源,那么可以借助一个服务器 ...

  8. java 接口 白名单,SpringBoot HTTP接口跨域调用及白名单实现

    背景 系统之前为一个单页应用提供过Rest接口,部署时这个单页应用与系统不在同一域内,出现跨域无法访问的问题.Spring 从 4.2 版本开始提供了@CrossOrigin注解,让这个问题的解决变得 ...

  9. Java httpClient中实现自定义DNS服务器地址配置

    这个故事从一个小的需求开始. 在知乎编辑器中,链接插入以后可以选择转化为一个链接卡片,用户体验太棒了.这么好的点子,我们必须学(chao)习(xi)过来啊. 这个事情就这么被安排给了我们的前端同学.. ...

最新文章

  1. 无法绑定由多个部分组成的标识符_「计算机组成原理」:I/O系统整体管理机制...
  2. Android一键多渠道分发打包实战和解析
  3. 皮一皮:中国好邻居!
  4. 简单的IDEA的快捷键操作和简写操作介绍(一)
  5. ajax跨域服务器404,Ajax和跨域
  6. 【openjudge】【字符串+模拟】1777:文件结构“图”
  7. OpenGL:读取图片显示
  8. XMLHttpRequest.status 返回服务器状态码
  9. Linux不用来写代码,我使用过的Linux命令之:(冒号) - 啥也不做(除了……)
  10. Entity Framework技巧系列之七 - Tip 26 – 28
  11. 统计表中有无数据并发送邮件
  12. 数字图像处理·SLIC超像素分割算法C++实现
  13. Stacked Hourglass Networks简析
  14. 51单片机数码管计数器
  15. 以阿里IoT开发物联网和应用平台
  16. GNSS观测方程及线性组合
  17. GX works2 三菱PLC 显示注释后代码行变宽的解决方法
  18. JVM学习笔记07-垃圾回收
  19. hdu 1043 Eight 经典八数码问题
  20. 通过4A系统登录服务器,JD-4A 统一身份管理系统

热门文章

  1. nginx正则表达式
  2. 专访Docker大牛:说服传统应用程序使用者是Docker面临的最大难题
  3. C# 输出目录结构树到Console或文本文件
  4. Oracle 11g 新特性 -- Invisible Indexes(不可见的索引) 说明
  5. js操作select相关方法(收集)
  6. 请问一下:诸位遇到输入汉字时会重复输入
  7. Weblogic Server上部署War包
  8. 数据管理的3种方法,看完后感叹:数字化转型、数据中台真不难
  9. 小猴子蓝裤黄袄的局域网聊天
  10. 一步一步写STL:空间配置器(1)