java.lang.IllegalArgumentException 在 URL 的路径中 Java
java.lang.IllegalArgumentException in URL's path in Java
我有一个 java 代码可以向接口发送 Web 服务请求。现在对于其中一个界面,我收到以下错误
java.lang.IllegalArgumentException: Illegal character(s) in message header field: http://10.11.22.33:8088/platform-core/smsGateMgw
at sun.net.www.protocol.http.HttpURLConnection.checkMessageHeader(HttpURLConnection.java:522)
at sun.net.www.protocol.http.HttpURLConnection.isExternalMessageHeaderAllowed(HttpURLConnection.java:492)
at sun.net.www.protocol.http.HttpURLConnection.setRequestProperty(HttpURLConnection.java:3057)
at com.in.ci.fioutbound.custom.SmsSender.sendSms(SmsSender1.java:255)
at com.in.ci.fioutbound.custom.SmsSender.executeOutboundRequest(SmsSender1.java:104)
我猜这是因为 URL 中的“-”,但不确定。
有人可以让我知道如何编码 URL 的路径,或者有其他方法可以处理这个问题。
这就是我的 java 代码现在的样子
URL smsServiceUrl = new URL(smsService);
URLConnection conn = smsServiceUrl.openConnection();
HttpURLConnection httpconn = (HttpURLConnection)conn;
ByteArrayOutputStream bout = new ByteArrayOutputStream();
byte[] buffer = new byte[reqXml.length()];
buffer = reqXml.getBytes();
bout.write(buffer);
byte[] b = bout.toByteArray();
httpconn.setRequestProperty("Content-Length", String.valueOf(b.length));
httpconn.setRequestProperty("Content-Type", "text/xml;charset=utf-8");
httpconn.setRequestProperty(smsService, smsService);
httpconn.setRequestMethod("POST");
httpconn.setDoOutput(true);
httpconn.setDoOutput(true);
OutputStream out = httpconn.getOutputStream();
out.write(b);
InputStreamReader isr = new InputStreamReader(httpconn.getInputStream());
BufferedReader in = new BufferedReader(isr);
while ((responseString = in.readLine()) != null) {
outputString = outputString + responseString;
}
此外,相同的代码在具有相同 URL 的另一台服务器上工作正常。唯一的区别是两个服务器之间的 java 1.7 和 1.8。这是 java 1.8 中的新功能吗?
HTTP 1.1 在 RFC 2616. Headers are defined in section 4.2, which refers to RFC 822 中定义,它在第 3.2 节中定义了它们,它本身将 header 字段名称定义为
field-name = 1*<any CHAR, excluding CTLs, SPACE, and ":">
这意味着您不能在 header 的名称中使用冒号 (:
)。
当您执行 httpconn.setRequestProperty(smsService, smsService);
时,您正在设置一个包含 :
(http://...
中的那个)的字段名称,它适合值,但不适用于名称。
header 似乎没有任何意义,因此您应该能够安全地从代码中删除整行。
编辑:
我刚刚注意到您没有使用 class 我以为您正在使用。您正在使用 sun.net.www.protocol.http.HttpURLConnection
而不是 java.net.HttpURLConnection
。
这可以解释为什么它在 Java 7 中有效,因为如果您查看 source code 中的 checkMessageHeader
方法,它不会检查 class是否包含:
private void checkMessageHeader(String key, String value) {
char LF = '\n';
int index = key.indexOf(LF);
if (index != -1) {
throw new IllegalArgumentException(
"Illegal character(s) in message header field: " + key);
}
else {
if (value == null) {
return;
}
index = value.indexOf(LF);
while (index != -1) {
index++;
if (index < value.length()) {
char c = value.charAt(index);
if ((c==' ') || (c=='\t')) {
// ok, check the next occurrence
index = value.indexOf(LF, index);
continue;
}
}
throw new IllegalArgumentException(
"Illegal character(s) in message header value: " + value);
}
}
}
虽然,例如 current version of openjdk 确实如此。
private void checkMessageHeader(String key, String value) {
char LF = '\n';
int index = key.indexOf(LF);
int index1 = key.indexOf(':');
if (index != -1 || index1 != -1) {
throw new IllegalArgumentException(
"Illegal character(s) in message header field: " + key);
}
// ... rest of the method ...
我不确定你 java 8 是哪个版本,因为在 OpenJDK 8 的 available source code 中,行号与你的不一致异常,而且 OpenJDK 8 似乎也没有该检查。
我有一个 java 代码可以向接口发送 Web 服务请求。现在对于其中一个界面,我收到以下错误
java.lang.IllegalArgumentException: Illegal character(s) in message header field: http://10.11.22.33:8088/platform-core/smsGateMgw
at sun.net.www.protocol.http.HttpURLConnection.checkMessageHeader(HttpURLConnection.java:522)
at sun.net.www.protocol.http.HttpURLConnection.isExternalMessageHeaderAllowed(HttpURLConnection.java:492)
at sun.net.www.protocol.http.HttpURLConnection.setRequestProperty(HttpURLConnection.java:3057)
at com.in.ci.fioutbound.custom.SmsSender.sendSms(SmsSender1.java:255)
at com.in.ci.fioutbound.custom.SmsSender.executeOutboundRequest(SmsSender1.java:104)
我猜这是因为 URL 中的“-”,但不确定。 有人可以让我知道如何编码 URL 的路径,或者有其他方法可以处理这个问题。 这就是我的 java 代码现在的样子
URL smsServiceUrl = new URL(smsService);
URLConnection conn = smsServiceUrl.openConnection();
HttpURLConnection httpconn = (HttpURLConnection)conn;
ByteArrayOutputStream bout = new ByteArrayOutputStream();
byte[] buffer = new byte[reqXml.length()];
buffer = reqXml.getBytes();
bout.write(buffer);
byte[] b = bout.toByteArray();
httpconn.setRequestProperty("Content-Length", String.valueOf(b.length));
httpconn.setRequestProperty("Content-Type", "text/xml;charset=utf-8");
httpconn.setRequestProperty(smsService, smsService);
httpconn.setRequestMethod("POST");
httpconn.setDoOutput(true);
httpconn.setDoOutput(true);
OutputStream out = httpconn.getOutputStream();
out.write(b);
InputStreamReader isr = new InputStreamReader(httpconn.getInputStream());
BufferedReader in = new BufferedReader(isr);
while ((responseString = in.readLine()) != null) {
outputString = outputString + responseString;
}
此外,相同的代码在具有相同 URL 的另一台服务器上工作正常。唯一的区别是两个服务器之间的 java 1.7 和 1.8。这是 java 1.8 中的新功能吗?
HTTP 1.1 在 RFC 2616. Headers are defined in section 4.2, which refers to RFC 822 中定义,它在第 3.2 节中定义了它们,它本身将 header 字段名称定义为
field-name = 1*<any CHAR, excluding CTLs, SPACE, and ":">
这意味着您不能在 header 的名称中使用冒号 (:
)。
当您执行 httpconn.setRequestProperty(smsService, smsService);
时,您正在设置一个包含 :
(http://...
中的那个)的字段名称,它适合值,但不适用于名称。
header 似乎没有任何意义,因此您应该能够安全地从代码中删除整行。
编辑:
我刚刚注意到您没有使用 class 我以为您正在使用。您正在使用 sun.net.www.protocol.http.HttpURLConnection
而不是 java.net.HttpURLConnection
。
这可以解释为什么它在 Java 7 中有效,因为如果您查看 source code 中的 checkMessageHeader
方法,它不会检查 class是否包含:
private void checkMessageHeader(String key, String value) {
char LF = '\n';
int index = key.indexOf(LF);
if (index != -1) {
throw new IllegalArgumentException(
"Illegal character(s) in message header field: " + key);
}
else {
if (value == null) {
return;
}
index = value.indexOf(LF);
while (index != -1) {
index++;
if (index < value.length()) {
char c = value.charAt(index);
if ((c==' ') || (c=='\t')) {
// ok, check the next occurrence
index = value.indexOf(LF, index);
continue;
}
}
throw new IllegalArgumentException(
"Illegal character(s) in message header value: " + value);
}
}
}
虽然,例如 current version of openjdk 确实如此。
private void checkMessageHeader(String key, String value) {
char LF = '\n';
int index = key.indexOf(LF);
int index1 = key.indexOf(':');
if (index != -1 || index1 != -1) {
throw new IllegalArgumentException(
"Illegal character(s) in message header field: " + key);
}
// ... rest of the method ...
我不确定你 java 8 是哪个版本,因为在 OpenJDK 8 的 available source code 中,行号与你的不一致异常,而且 OpenJDK 8 似乎也没有该检查。