如何修复 java 中的 http 响应代码 400 错误?是否存在格式错误的请求语法或无效的请求消息框架?
How to fix http response code 400 error in java ? Is there any malformed request syntax or invalid request message framing?
我在 IBM Watson Studio 中创建了一个 ML 模型,并将该模型部署到网络服务中。我需要创建一个 java 程序来发送输入并从该 Web 服务检索输出。
我检查了我所有的连接凭据,没有问题。
我在这里使用的代码与 watson-studio 中给出的代码相同(在部署部分下的实施选项卡中)我仍然遇到错误。
程序停在这一行
scoringBuffer = new BufferedReader(new InputStreamReader(scoringConnection.getInputStream()));
检查此代码:-
package Original;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;
public class Iris_Deployment {
public static void main(String[] args) {
// NOTE: you must manually construct wml_credentials hash map below
// using information retrieved from your IBM Cloud Watson Machine Learning Service instance.
Map<String, String> wml_credentials = new HashMap<String, String>()
{{
put("url", "https://eu-gb.ml.cloud.ibm.com");
put("username", "my-username-comes-here");
put("password", "my-password-comes-here");
}};
String wml_auth_header = "Basic " +
Base64.getEncoder().encodeToString((wml_credentials.get("username") + ":" +
wml_credentials.get("password")).getBytes(StandardCharsets.UTF_8));
String wml_url = wml_credentials.get("url") + "/v3/identity/token";
HttpURLConnection tokenConnection = null;
HttpURLConnection scoringConnection = null;
BufferedReader tokenBuffer = null;
BufferedReader scoringBuffer = null;
try {
// Getting WML token
URL tokenUrl = new URL(wml_url);
tokenConnection = (HttpURLConnection) tokenUrl.openConnection();
tokenConnection.setDoInput(true);
tokenConnection.setDoOutput(true);
tokenConnection.setRequestMethod("GET");
tokenConnection.setRequestProperty("Authorization", wml_auth_header);
tokenBuffer = new BufferedReader(new InputStreamReader(tokenConnection.getInputStream()));
StringBuffer jsonString = new StringBuffer();
String line;
while ((line = tokenBuffer.readLine()) != null) {
jsonString.append(line);
}
// Scoring request
URL scoringUrl = new URL("https://eu-gb.ml.cloud.ibm.com/v3/wml_instances/3c523ca2-c5b5-409f-9773-7634c8bc5144/deployments/80b8046d-84e0-4081-a770-d10099c4a378/online");
String wml_token = "Bearer " +
jsonString.toString()
.replace("\"","")
.replace("}", "")
.split(":")[1];
scoringConnection = (HttpURLConnection) scoringUrl.openConnection();
scoringConnection.setDoInput(true);
scoringConnection.setDoOutput(true);
scoringConnection.setRequestMethod("POST");
scoringConnection.setRequestProperty("Accept", "application/json");
scoringConnection.setRequestProperty("Authorization", wml_token);
scoringConnection.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
OutputStreamWriter writer = new OutputStreamWriter(scoringConnection.getOutputStream(), "UTF-8");
// NOTE: manually define and pass the array(s) of values to be scored in the next line
String payload = "{\"fields\": [\"SepalLengthCm\", \"SepalWidthCm\", \"PetalLengthCm\", \"PetalWidthCm\"], \"values\": [{1.2, 1.3, 2.2, 2.3}]}";
writer.write(payload);
writer.close();
scoringBuffer = new BufferedReader(new InputStreamReader(scoringConnection.getInputStream()));
StringBuffer jsonStringScoring = new StringBuffer();
String lineScoring;
while ((lineScoring = scoringBuffer.readLine()) != null) {
jsonStringScoring.append(lineScoring);
}
System.out.println(jsonStringScoring);
} catch (IOException e) {
System.out.println("The URL is not valid.");
e.printStackTrace();
}
finally {
if (tokenConnection != null) {
tokenConnection.disconnect();
}
if (tokenBuffer != null) {
try {
tokenBuffer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (scoringConnection != null) {
scoringConnection.disconnect();
}
if (scoringBuffer != null) {
try {
scoringBuffer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
错误:-
The URL is not valid.
java.io.IOException: Server returned HTTP response code: 400 for URL: https://eu-gb.ml.cloud.ibm.com/v3/wml_instances/3c523ca2-c5b5-409f-9773-7634c8bc5144/deployments/80b8046d-84e0-4081-a770-d10099c4a378/online
at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1913)
at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1509)
at java.base/sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:245)
at Original.Iris_Deployment.main(Iris_Deployment.java:71)
Process finished with exit code 0
请尝试按如下方式传递您的评分负载:
\"values\": [[1.2, 1.3, 2.2, 2.3]]
(将内部的“{”替换为“[”)
我在 IBM Watson Studio 中创建了一个 ML 模型,并将该模型部署到网络服务中。我需要创建一个 java 程序来发送输入并从该 Web 服务检索输出。
我检查了我所有的连接凭据,没有问题。
我在这里使用的代码与 watson-studio 中给出的代码相同(在部署部分下的实施选项卡中)我仍然遇到错误。
程序停在这一行
scoringBuffer = new BufferedReader(new InputStreamReader(scoringConnection.getInputStream()));
检查此代码:-
package Original;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;
public class Iris_Deployment {
public static void main(String[] args) {
// NOTE: you must manually construct wml_credentials hash map below
// using information retrieved from your IBM Cloud Watson Machine Learning Service instance.
Map<String, String> wml_credentials = new HashMap<String, String>()
{{
put("url", "https://eu-gb.ml.cloud.ibm.com");
put("username", "my-username-comes-here");
put("password", "my-password-comes-here");
}};
String wml_auth_header = "Basic " +
Base64.getEncoder().encodeToString((wml_credentials.get("username") + ":" +
wml_credentials.get("password")).getBytes(StandardCharsets.UTF_8));
String wml_url = wml_credentials.get("url") + "/v3/identity/token";
HttpURLConnection tokenConnection = null;
HttpURLConnection scoringConnection = null;
BufferedReader tokenBuffer = null;
BufferedReader scoringBuffer = null;
try {
// Getting WML token
URL tokenUrl = new URL(wml_url);
tokenConnection = (HttpURLConnection) tokenUrl.openConnection();
tokenConnection.setDoInput(true);
tokenConnection.setDoOutput(true);
tokenConnection.setRequestMethod("GET");
tokenConnection.setRequestProperty("Authorization", wml_auth_header);
tokenBuffer = new BufferedReader(new InputStreamReader(tokenConnection.getInputStream()));
StringBuffer jsonString = new StringBuffer();
String line;
while ((line = tokenBuffer.readLine()) != null) {
jsonString.append(line);
}
// Scoring request
URL scoringUrl = new URL("https://eu-gb.ml.cloud.ibm.com/v3/wml_instances/3c523ca2-c5b5-409f-9773-7634c8bc5144/deployments/80b8046d-84e0-4081-a770-d10099c4a378/online");
String wml_token = "Bearer " +
jsonString.toString()
.replace("\"","")
.replace("}", "")
.split(":")[1];
scoringConnection = (HttpURLConnection) scoringUrl.openConnection();
scoringConnection.setDoInput(true);
scoringConnection.setDoOutput(true);
scoringConnection.setRequestMethod("POST");
scoringConnection.setRequestProperty("Accept", "application/json");
scoringConnection.setRequestProperty("Authorization", wml_token);
scoringConnection.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
OutputStreamWriter writer = new OutputStreamWriter(scoringConnection.getOutputStream(), "UTF-8");
// NOTE: manually define and pass the array(s) of values to be scored in the next line
String payload = "{\"fields\": [\"SepalLengthCm\", \"SepalWidthCm\", \"PetalLengthCm\", \"PetalWidthCm\"], \"values\": [{1.2, 1.3, 2.2, 2.3}]}";
writer.write(payload);
writer.close();
scoringBuffer = new BufferedReader(new InputStreamReader(scoringConnection.getInputStream()));
StringBuffer jsonStringScoring = new StringBuffer();
String lineScoring;
while ((lineScoring = scoringBuffer.readLine()) != null) {
jsonStringScoring.append(lineScoring);
}
System.out.println(jsonStringScoring);
} catch (IOException e) {
System.out.println("The URL is not valid.");
e.printStackTrace();
}
finally {
if (tokenConnection != null) {
tokenConnection.disconnect();
}
if (tokenBuffer != null) {
try {
tokenBuffer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (scoringConnection != null) {
scoringConnection.disconnect();
}
if (scoringBuffer != null) {
try {
scoringBuffer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
错误:-
The URL is not valid.
java.io.IOException: Server returned HTTP response code: 400 for URL: https://eu-gb.ml.cloud.ibm.com/v3/wml_instances/3c523ca2-c5b5-409f-9773-7634c8bc5144/deployments/80b8046d-84e0-4081-a770-d10099c4a378/online
at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1913)
at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1509)
at java.base/sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:245)
at Original.Iris_Deployment.main(Iris_Deployment.java:71)
Process finished with exit code 0
请尝试按如下方式传递您的评分负载:
\"values\": [[1.2, 1.3, 2.2, 2.3]]
(将内部的“{”替换为“[”)