IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> Hue Rest api Java调用 -> 正文阅读

[网络协议]Hue Rest api Java调用

Hue Rest api 调用

最近在工作中使用到了Hue,由于Hue本身是使用python开发的,官方所提供的调用示例用的也是python和js进行演示,这里提供一个登录并执行添加用户操作的实现案例,对应的Hue版本是4.1

一、登录鉴权

我本身对于Hue的了解并不深,也没学过python但是从官网的描述及示例,可以看到Hue的登录进行了两次请求第一次是get类型,第二次是post类型:

  1. 第一次请求 :第一次是get请求,对应了Hue的登录页面; 在这里插入图片描述在这个页面中可以开启控制台网络查看可以看到这里发送了一个get请求,请求地址就是浏览器地址栏的地址
    响应头:在这里插入图片描述这里可以看到这一次登录页面的请求中响应提供了token,和sessionid这里需要把这两个值在正式的post登录请求中添加到cookie中才能进行登录,至此第一次请求结束

  2. 第二次请求:第二次请求就是填写完账户密码后提交表单进行的请求,请求地址是点击submit后提交的post请求,这些都可以在控制台中查看到,第二次请求就需要将第一次请求中得到的token及sessionId信息添加到cookie中来完成登录操作
    请求头:在这里插入图片描述可以看到cookie中的内容与第一次请求得到的内容是相同的,并且第二次请求会再次响应一次token和sessionId,这里得到的就是通过了鉴权认证的token和sessionId。之后的每次操作如添加用户等只需要在发送请求时设定cookie就可以通过权限认证了
    响应头:在这里插入图片描述其实只要搞明白这两个请求的作用,取得了正确的cookie内容,就可以自己进行代码编写了,这里我贴一个案例,进行了添加用户的操作

package com.mryoung.test.request.hue.service;


import com.alibaba.fastjson.JSONObject;
import org.junit.jupiter.api.Test;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;

import java.net.URI;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static org.apache.commons.lang3.StringUtils.join;
import static org.apache.commons.lang3.StringUtils.split;


public class LoginTest {
   private static String host="http://localhost:8080";
   private static String username="username";
   private static String password="password";
   RestTemplate restTemplate = new RestTemplate();


   public Map<String,String> getLoginCookie(){

       //先执行get请求从headers中取得csrftoken和sessionid
       ResponseEntity<String> responseEntity=restTemplate.getForEntity(host+"/hue/accounts/login/?next=/",String.class);
       HttpHeaders headers = responseEntity.getHeaders();
       List<String> headerValues = headers.get("Set-Cookie");
       String fullCsrfToken = headerValues.get(0).split(";")[0];
       String fullSessionId = headerValues.get(1).split(";")[0];
       String nextCookie=join(new String[]{fullCsrfToken,fullSessionId},";");
       String csrfToken = fullCsrfToken.split("=")[1];

       //得到sessionId和token后构建post登录请求
       //设置body相关信息,参数和header可以直接按照控制台显示的情况来添加
       MultiValueMap<String,String> map=new LinkedMultiValueMap<>();
       map.add("csrfmiddlewaretoken",csrfToken);
       map.add("username",username);
       map.add("password",password);
       map.add("server", "LDAP");
       map.add("next","/");

       //设置header相关信息
       HttpHeaders httpHeaders=new HttpHeaders();
       httpHeaders.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
       httpHeaders.add(HttpHeaders.COOKIE,nextCookie);
       //登陆成功后响应头中会返回正式使用的token和sessionId
       ResponseEntity<String> loginedBody=restTemplate.postForEntity(host+"/accounts/login/",new HttpEntity<>(map,httpHeaders),String.class);
       HttpHeaders curHeaders = loginedBody.getHeaders();
       List<String> strings = curHeaders.get("Set-Cookie");
       String fullCurCsrToken = strings.get(0).split(";")[0];
       String fullCurSessionId = strings.get(1).split(";")[0];
       HashMap<String, String> loginValueMap = new HashMap<>();
       loginValueMap.put("loginCookie",join(new String[]{fullCurCsrToken,fullCurSessionId},";"));
       loginValueMap.put("csrfToken",fullCurCsrToken.split("=")[1]);
       return loginValueMap;
   }


   @Test
   public void addUser(){
       Map<String, String> loginCookieMap = getLoginCookie();
       String csrfToken = loginCookieMap.get("csrfToken");
       String loginCookie = loginCookieMap.get("loginCookie");

       String url=host+"/useradmin/users/add_ldap_users";

       //构建header
       HttpHeaders headers=new HttpHeaders();
       headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
       headers.add("X-CSRFToken",csrfToken);
       headers.add("X-Requested-With","XMLHttpRequest");
       headers.add(HttpHeaders.COOKIE,loginCookie);

       //构建请求体,token就用之前拿到的登录后的token,其他参数照着控制台填即可
       MultiValueMap<String,Object> body=new LinkedMultiValueMap<>();
       body.add("csrfmiddlewaretoken",csrfToken);
       body.add("username_pattern","demo");

       //执行添加用户请求
       ResponseEntity<String> stringResponseEntity = restTemplate.postForEntity(url, new HttpEntity<>(body, headers), String.class);
   }
}

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-10-30 12:49:11  更:2021-10-30 12:49:54 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年7日历 -2024/7/1 21:25:16-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码