如何修复 dialogflow 身份验证问题
How to fix dialogflow authentication issue
我有一个 dialogflow 项目,我正尝试通过休息呼叫从 Java 访问该项目。
它给我一个身份验证问题。
我已按照所有在线说明(以及许多论坛建议)无济于事。
我已尝试按照此处的说明生成密钥 json:
https://dialogflow.com/docs/reference/v2-auth-setup
并按照描述设置我的环境变量,但似乎没有任何效果。
我已经检查了我的 projectID,并且 运行 离开了带有环境变量的同一台机器,并对它的名称和位置进行了两次、三次和四次检查,但我仍然收到以下错误:
java.net.HttpRetryException: cannot retry due to server authentication, in streaming mode
这是我的代码(虽然它是一个 REST 调用,所以我不知道它是否如此相关):
String url = https://dialogflow.googleapis.com/v2/projects/MYPROJECT/agent/sessions/SESSION_NUM:detectIntent
URL url = new URL(full_url);
String inText = "Hello World";
String outText = "";
HttpURLConnection con = (HttpURLConnection) url.openConnection();
try {
con.setDoOutput(true);
con.setRequestMethod("POST");
// set body of http post
Map<String,String> arguments = new HashMap<>();
JSONObject inTextJsn = new JSONObject();
inTextJsn.append("text",inText);
inTextJsn.append("languageCode","en");
JSONObject fieldJsn = new JSONObject();
fieldJsn.append("text", inTextJsn);
arguments.put("queryInput", fieldJsn.toString());
StringJoiner sj = new StringJoiner("&");
for(Map.Entry<String,String> entry : arguments.entrySet())
sj.add(URLEncoder.encode(entry.getKey(), "UTF-8") + "="
+ URLEncoder.encode(entry.getValue(), "UTF-8"));
// post http post as bytes
byte[] bytes_out = sj.toString().getBytes(StandardCharsets.UTF_8);
con.setFixedLengthStreamingMode(bytes_out.length);
con.connect();
try (OutputStream os = con.getOutputStream()) {
os.write(bytes_out);
}
BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream(),
"UTF-8"));
// read all lines to a string
String line;
String response = "";
while ((line = reader.readLine()) != null) {
response += line;
}
JSONObject responseJsn = new JSONObject(response);
outText = responseJsn.get("fulfillmentText").toString();
} catch (Exception e) {
System.err.println(e);
} finally {
con.disconnect();
}
return restResponse;
代码的要点是简单地向我的对话流发送一条消息 ("Hello World!"),然后取回我的代理的响应(代码可能有错误 - 当我可以测试时有点难'无法通过此身份验证问题,因此请帮助进行身份验证,而不是代码错误)。
谢谢大家!
该页面上的说明假定您将使用 gcloud
程序生成当前有效的不记名令牌,然后将其与 HTTP header 一起发送。该页面说明
您的代码似乎根本没有生成 Authorization
HTTP header,这就是您收到错误的原因。
由于您使用的是 Java,因此您应该查看 google-auth-library-java library,它将为您提供生成令牌的工具,您需要在 Authorization
header.
您也可以查看 google-cloud-java library。这包含 Java 类 以直接对 Dialogflow 执行操作,而不是自己编写 REST/HTTP 调用。 (但是,它仍处于 Dialogflow 的 Alpha 级别,因此可能不稳定或向前兼容。)
我有一个 dialogflow 项目,我正尝试通过休息呼叫从 Java 访问该项目。 它给我一个身份验证问题。 我已按照所有在线说明(以及许多论坛建议)无济于事。
我已尝试按照此处的说明生成密钥 json:
https://dialogflow.com/docs/reference/v2-auth-setup
并按照描述设置我的环境变量,但似乎没有任何效果。 我已经检查了我的 projectID,并且 运行 离开了带有环境变量的同一台机器,并对它的名称和位置进行了两次、三次和四次检查,但我仍然收到以下错误:
java.net.HttpRetryException: cannot retry due to server authentication, in streaming mode
这是我的代码(虽然它是一个 REST 调用,所以我不知道它是否如此相关):
String url = https://dialogflow.googleapis.com/v2/projects/MYPROJECT/agent/sessions/SESSION_NUM:detectIntent
URL url = new URL(full_url);
String inText = "Hello World";
String outText = "";
HttpURLConnection con = (HttpURLConnection) url.openConnection();
try {
con.setDoOutput(true);
con.setRequestMethod("POST");
// set body of http post
Map<String,String> arguments = new HashMap<>();
JSONObject inTextJsn = new JSONObject();
inTextJsn.append("text",inText);
inTextJsn.append("languageCode","en");
JSONObject fieldJsn = new JSONObject();
fieldJsn.append("text", inTextJsn);
arguments.put("queryInput", fieldJsn.toString());
StringJoiner sj = new StringJoiner("&");
for(Map.Entry<String,String> entry : arguments.entrySet())
sj.add(URLEncoder.encode(entry.getKey(), "UTF-8") + "="
+ URLEncoder.encode(entry.getValue(), "UTF-8"));
// post http post as bytes
byte[] bytes_out = sj.toString().getBytes(StandardCharsets.UTF_8);
con.setFixedLengthStreamingMode(bytes_out.length);
con.connect();
try (OutputStream os = con.getOutputStream()) {
os.write(bytes_out);
}
BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream(),
"UTF-8"));
// read all lines to a string
String line;
String response = "";
while ((line = reader.readLine()) != null) {
response += line;
}
JSONObject responseJsn = new JSONObject(response);
outText = responseJsn.get("fulfillmentText").toString();
} catch (Exception e) {
System.err.println(e);
} finally {
con.disconnect();
}
return restResponse;
代码的要点是简单地向我的对话流发送一条消息 ("Hello World!"),然后取回我的代理的响应(代码可能有错误 - 当我可以测试时有点难'无法通过此身份验证问题,因此请帮助进行身份验证,而不是代码错误)。
谢谢大家!
该页面上的说明假定您将使用 gcloud
程序生成当前有效的不记名令牌,然后将其与 HTTP header 一起发送。该页面说明
您的代码似乎根本没有生成 Authorization
HTTP header,这就是您收到错误的原因。
由于您使用的是 Java,因此您应该查看 google-auth-library-java library,它将为您提供生成令牌的工具,您需要在 Authorization
header.
您也可以查看 google-cloud-java library。这包含 Java 类 以直接对 Dialogflow 执行操作,而不是自己编写 REST/HTTP 调用。 (但是,它仍处于 Dialogflow 的 Alpha 级别,因此可能不稳定或向前兼容。)