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);
   }
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值