我在项目中工作时遇到问题,当我尝试将字符串解析为URL时,我可以发送我的HttpRequest。问题是无法转换字符串而我正在
java.lang.IllegalArgumentException:网址中没有':'
这是我正在使用的方法
public String getResultat() throws Exception {
/// CODE J2ME
int ch;
StringBuffer sb = new StringBuffer("");
HttpConnection ht;
DataInputStream ds;
try {
String chx="http:x.com";
String ecodedString=EnvoyerSMS.urlEncode(chx);
ht = (HttpConnection) Connector.open(ecodedString);
ds = ht.openDataInputStream();
while ((ch = ds.read()) != -1) {
sb.append((char)ch);
}
} catch (IOException ex) {
ex.printStackTrace();
}
String reponse = sb.toString().trim();
System.out.println("REPONSE "+reponse);
return reponse;
}
这是我用来转换我的String
的静态方法 public static String urlEncode(String s) {
StringBuffer sbuf = new StringBuffer();
int len = s.length();
for (int i = 0; i < len; i++) {
int ch = s.charAt(i);
if ('A' <= ch && ch <= 'Z') { // 'A'..'Z'
sbuf.append((char)ch);
} else if ('a' <= ch && ch <= 'z') { // 'a'..'z'
sbuf.append((char)ch);
} else if ('0' <= ch && ch <= '9') { // '0'..'9'
sbuf.append((char)ch);
} else if (ch == ' ') { // space
sbuf.append('+');
} else if (ch == '-' || ch == '_' //these characters don't need encoding
|| ch == '.' || ch == '*') {
sbuf.append((char)ch);
} else if (ch <= 0x007f) { // other ASCII
sbuf.append(hex(ch));
} else if (ch <= 0x07FF) { // non-ASCII <= 0x7FF
sbuf.append(hex(0xc0 | (ch >> 6)));
sbuf.append(hex(0x80 | (ch & 0x3F)));
} else { // 0x7FF < ch <= 0xFFFF
sbuf.append(hex(0xe0 | (ch >> 12)));
sbuf.append(hex(0x80 | ((ch >> 6) & 0x3F)));
sbuf.append(hex(0x80 | (ch & 0x3F)));
}
}
return sbuf.toString();
}
//get the encoded value of a single symbol, each return value is 3 characters long
static String hex(int sym)
{
return(hex.substring(sym*3, sym*3 + 3));
}
// Hex constants concatenated into a string, messy but efficient
final static String hex =
"%00%01%02%03%04%05%06%07%08%09%0a%0b%0c%0d%0e%0f%10%11%12%13%14%15%16%17%18%19%1a%1b%1c%1d%1e%1f" +
"%20%21%22%23%24%25%26%27%28%29%2a%2b%2c%2d%2e%2f%30%31%32%33%34%35%36%37%38%39%3a%3b%3c%3d%3e%3f" +
"%40%41%42%43%44%45%46%47%48%49%4a%4b%4c%4d%4e%4f%50%51%52%53%54%55%56%57%58%59%5a%5b%5c%5d%5e%5f" +
"%60%61%62%63%64%65%66%67%68%69%6a%6b%6c%6d%6e%6f%70%71%72%73%74%75%76%77%78%79%7a%7b%7c%7d%7e%7f" +
"%80%81%82%83%84%85%86%87%88%89%8a%8b%8c%8d%8e%8f%90%91%92%93%94%95%96%97%98%99%9a%9b%9c%9d%9e%9f" +
"%a0%a1%a2%a3%a4%a5%a6%a7%a8%a9%aa%ab%ac%ad%ae%af%b0%b1%b2%b3%b4%b5%b6%b7%b8%b9%ba%bb%bc%bd%be%bf" +
"%c0%c1%c2%c3%c4%c5%c6%c7%c8%c9%ca%cb%cc%cd%ce%cf%d0%d1%d2%d3%d4%d5%d6%d7%d8%d9%da%db%dc%dd%de%df" +
"%e0%e1%e2%e3%e4%e5%e6%e7%e8%e9%ea%eb%ec%ed%ee%ef%f0%f1%f2%f3%f4%f5%f6%f7%f8%f9%fa%fb%fc%fd%fe%ff";
}
谢谢:D
答案 0 :(得分:1)
URLEncoder不等同于您编写的代码。相当于
new URI(null, string, null).toASCIIString()
尽管它的名字,URLEncoder不是用于编码URL。它用于编码URL 参数,和POST键值对。
答案 1 :(得分:0)
不应该是http://x.com
而不是http:x.com
吗?
如果您有一个非常简单的URL(即没有参数),您根本不需要对其进行编码。
但是,假设您的网址确实包含参数 - 例如http://x.com?param1=value1¶m2=value2
,那么您只需编码参数值,如下所示:
String encodedString = "http://x.com?param1=" + EnvoyerSMS.urlEncode(value1) + "¶m2=" + EnvoyerSMS.urlEncode(value2);
...但是使用StringBuffer
来连接这些部分,而不是像我一样使用+
运算符。
注意 - 您收到no ':' in URL
错误的原因是因为您错误地编码了整个网址,因此:
字符也被编码(无论其编码的等效字符是什么)。
如果您执行System.out.println(encodedString);
,则会看到HttpConnection
对象尝试使用的网址。