如何获取设备访问令牌并执行多个 HTTP POST 请求

Posted

技术标签:

【中文标题】如何获取设备访问令牌并执行多个 HTTP POST 请求【英文标题】:How to get device Access token and perform multiple HTTP POST Request 【发布时间】:2020-10-28 13:13:01 【问题描述】:

我目前正在使用 IoT 平台“Thingsboard”开展一个项目,在该平台上我创建了多个设备,并且我想从 JSON 文件向每个设备发送数据,我正在使用 Rest Api 来执行这个请求,但是我一直在苦苦挣扎如何获取我的设备的 access token 并解析它们中的每一个我的请求作为标头参数。我只是通过使用 Curl 手动完成,但我现在想自动完成。我知道 Thingsboard 有一个用 java (https://thingsboard.io/docs/reference/rest-client/) 编写的 Rest 客户端 Api,所以我尝试在我的脚本中使用它,但我没有工作。我是使用 Rest Api 的新手,所以如果有人能给我一个线索,那将非常有帮助。

这是我的请求代码的一部分:

                private static String token;
         public String getToken() 
                return token;
            

                String paramValue = "param\\with\\backslash";
                String yourURLStr = "http://host.com?param=" + java.net.URLEncoder.encode(paramValue, "UTF-8");

                URL url2 = new URL("https://demo.thingsboard.io/api/v1/token/telemetry?token=$JWT_TOKEN");
                HttpsURLConnection conn = (HttpsURLConnection) url2.openConnection();
                conn.setRequestMethod("POST");
                conn.setRequestProperty("Content-Type", "application/json");
                conn.setRequestProperty("Accept", "application/json");
                conn.setRequestProperty(JWT_TOKEN_HEADER_PARAM, "Bearer" +token);

                conn.setDoOutput(true);
                OutputStream outStream = conn.getOutputStream();
                OutputStreamWriter outStreamWriter = new OutputStreamWriter(outStream, "UTF-8");
                outStreamWriter.write(list.toString());
                outStreamWriter.flush();
                outStreamWriter.close();
                outStream.close();
                String response = null;

                System.out.println(conn.getResponseCode());
                System.out.println(conn.getResponseMessage());

                DataInputStream input1 = null;
                input1 = new DataInputStream (conn.getInputStream());
                while (null != ((response = input1.readLine()))) 
                    System.out.println(response);
                    input1.close ();
                
            
            
            catch (FileNotFoundException e) 
                e.printStackTrace();
             catch (IOException e) 
                e.printStackTrace();
             catch (ParseException e) 
                e.printStackTrace();
            

【问题讨论】:

thingsboard.io/docs/reference/rest-api 【参考方案1】:

如果您试图让 JWT-token 进行身份验证,则以下 java 应该可以工作:

Request request = Request.Post("http://THINGSBOARD_URL/api/auth/login");
String body = "\"username\":\"tenant@thingsboard.org\", \"password\":\"tenant\"";
request.bodyString(body,ContentType.APPLICATION_JSON);
request.setHeader("Content-Type", "application/json");
request.setHeader("Accept", "application/json");
HttpResponse httpResponse = request.execute().returnResponse();
System.out.println(httpResponse.getStatusLine());
if (httpResponse.getEntity() != null) 
    String html = EntityUtils.toString(httpResponse.getEntity());
    System.out.println(html);

不要混淆用于租户身份验证的 JWT-Token 和用于设备身份验证的 Access-Token。

【讨论】:

以上是关于如何获取设备访问令牌并执行多个 HTTP POST 请求的主要内容,如果未能解决你的问题,请参考以下文章

使用 Jquery 获取 Web api 的访问令牌

如何在http post请求中发送参数以获取laravel中的数据

客户端是不是应该使用 GET 或 POST 获取 OAuth 2 访问令牌?

无法使用 jQuery 执行 POST 请求以获取 Strava OAuth 令牌

如何在java中解码访问令牌并获取用户名和电子邮件?

访问令牌后的Keycloak授权过程