Java调用Hue接口
Hue Rest api 调用
最近在工作中使用到了Hue,由于Hue本身是使用python开发的,官方所提供的调用示例用的也是python和js进行演示,这里提供一个登录并执行添加用户操作的实现案例,对应的Hue版本是4.1
一、登录鉴权
我本身对于Hue的了解并不深,也没学过python但是从官网的描述及示例,可以看到Hue的登录进行了两次请求第一次是get类型,第二次是post类型:
-
第一次请求 :第一次是get请求,对应了Hue的登录页面; 在这个页面中可以开启控制台网络查看可以看到这里发送了一个get请求,请求地址就是浏览器地址栏的地址
响应头:这里可以看到这一次登录页面的请求中响应提供了token,和sessionid这里需要把这两个值在正式的post登录请求中添加到cookie中才能进行登录,至此第一次请求结束 -
第二次请求:第二次请求就是填写完账户密码后提交表单进行的请求,请求地址是点击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);
}
}