java httpclient 跨域_13、HttpClient服务器跨域请求
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服务器跨域请求相关推荐
- 【愚公系列】2022年01月 Java教学课程 71-自建HTTP服务器解析浏览器请求案例
文章目录 一.自建HTTP服务器解析浏览器请求案例 1.环境搭建 2.获取请求信息并解析 3.给浏览器响应数据 4.代码优化 一.自建HTTP服务器解析浏览器请求案例 1.环境搭建 实现步骤 编写Ht ...
- ad域时间源配置_AD域控NTP服务器修改 域控时间与互联网同步
访客您好,登录后可看更多精彩内容!发帖.回复积分还可换实物奖品哦,还在犹豫什么,赶紧注册登录吧! 您需要 登录 才可以下载或查看,没有帐号?立即注册 x 本帖最后由 bijiafeng 于 2020- ...
- java服务端 json接口_java以json格式向后台服务器接口发送请求的实例
java以json格式向后台服务器接口发送请求的实例 发布于 2021-1-14| 复制链接 下面小妖就为大家分享一篇java以json格式向后台服务器接口发送请求的实例,具有很好的参考价值,希望对大 ...
- 使用Httpclient来替代客户端的jsonp跨域解决方案
最近接手一个项目,新项目需要调用老项目的接口,但是老项目和新项目不再同一个域名下,所以必须进行跨域调用了,但是老项目又不能进行任何修改,所以jsonp也无法解决了,于是想到了使用了Httpclient ...
- Ajax跨域访问Tomcat服务器
在学习jQuery的时候进行到AJax时,需要与服务器进行交互练习.我毫不犹豫的打开了我的Tomcat服务器运行起来,并使用普通的ajax方法访问运行中的服务器网址的时候,发现 XMLHttpRequ ...
- 新版vue-cli模板下本地开发环境使用node服务器跨域
背景 我们都知道浏览器有一个既核心也最基本的安全功能,即同源策略.同源分别是:协议,域名,端口.如果浏览器访问服务器不同源的话,就会访问不到数据.那开发中常常访问的服务器不同源,那么可以借助一个服务器 ...
- vue读取服务器文件跨域,新版vue-cli模板下本地开发环境使用node服务器跨域的方法...
背景 我们都知道浏览器有一个既核心也最基本的安全功能,即同源策略.同源分别是:协议,域名,端口.如果浏览器访问服务器不同源的话,就会访问不到数据.那开发中常常访问的服务器不同源,那么可以借助一个服务器 ...
- java 接口 白名单,SpringBoot HTTP接口跨域调用及白名单实现
背景 系统之前为一个单页应用提供过Rest接口,部署时这个单页应用与系统不在同一域内,出现跨域无法访问的问题.Spring 从 4.2 版本开始提供了@CrossOrigin注解,让这个问题的解决变得 ...
- Java httpClient中实现自定义DNS服务器地址配置
这个故事从一个小的需求开始. 在知乎编辑器中,链接插入以后可以选择转化为一个链接卡片,用户体验太棒了.这么好的点子,我们必须学(chao)习(xi)过来啊. 这个事情就这么被安排给了我们的前端同学.. ...
最新文章
- 无法绑定由多个部分组成的标识符_「计算机组成原理」:I/O系统整体管理机制...
- Android一键多渠道分发打包实战和解析
- 皮一皮:中国好邻居!
- 简单的IDEA的快捷键操作和简写操作介绍(一)
- ajax跨域服务器404,Ajax和跨域
- 【openjudge】【字符串+模拟】1777:文件结构“图”
- OpenGL:读取图片显示
- XMLHttpRequest.status 返回服务器状态码
- Linux不用来写代码,我使用过的Linux命令之:(冒号) - 啥也不做(除了……)
- Entity Framework技巧系列之七 - Tip 26 – 28
- 统计表中有无数据并发送邮件
- 数字图像处理·SLIC超像素分割算法C++实现
- Stacked Hourglass Networks简析
- 51单片机数码管计数器
- 以阿里IoT开发物联网和应用平台
- GNSS观测方程及线性组合
- GX works2 三菱PLC 显示注释后代码行变宽的解决方法
- JVM学习笔记07-垃圾回收
- hdu 1043 Eight 经典八数码问题
- 通过4A系统登录服务器,JD-4A 统一身份管理系统