如何获取设备访问令牌并执行多个 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 请求的主要内容,如果未能解决你的问题,请参考以下文章
如何在http post请求中发送参数以获取laravel中的数据
客户端是不是应该使用 GET 或 POST 获取 OAuth 2 访问令牌?