gpt4 book ai didi

string - 在为 GET 请求编码参数时如何处理空字符串?

转载 作者:行者123 更新时间:2023-12-01 11:50:05 25 4
gpt4 key购买 nike

我正在开发一个使用 HTTP GET 请求与服务器通信的 J2ME 应用程序。我已经有了生成 URL 编码参数的方法。

在目前的形式中,它不能满足空字符串的要求,我看到的其他代码片段也有这个缺陷,因为它们都依赖于比较字符串参数的各个字符。 I have previously asked a question related to this empty char dilemma

编辑:

向服务器(Play 1.0)的请求形式为

http://server.com/setName/firstname/othername/lastname

参数不能为空所以http:server.com/setname/firstname//lastname无效

参数是从 json 对象中检索的。目前我使用的 url 编码方法将对所有提取的参数进行正确编码,并保留任何无法按原样转换的字符。字符串中的空格,如“Jo e”和空格字符本身将分别编码为 Jo%20e 和 %20。 JSON对象

{ "firstname":"joe"
"othername":""
"lastname":"bloggs"
}

然而会导致无效的 url http://server.com/setname/joe//bloggs因为 othername 参数是一个空字符串,并且由我的方法原样保留。

我可以检查要返回的字符串是否为空,然后返回一个空格字符。但我想知道是否没有对这种方法进行更好的修改或一种更健壮的全新方法?

 public static String urlEncode(String s) {
ByteArrayOutputStream bOut = null;
DataOutputStream dOut = null;
ByteArrayInputStream bIn = null;
StringBuffer ret = new StringBuffer();
try {
bOut=new ByteArrayOutputStream();
dOut = new DataOutputStream(bOut);
//return value
dOut.writeUTF(s);
bIn = new ByteArrayInputStream(bOut.toByteArray());
bIn.read();
bIn.read();
int c = bIn.read();
while (c >= 0) {
if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') || c == '.' || c == '-' || c == '*' || c == '_') {
ret.append((char) c);
} else if (c == ' ' ) {
//ret.append('+');
ret.append("%20");
} else {
if (c < 128) {
appendHex(c, ret);
} else if (c < 224) {
appendHex(c, ret);
appendHex(bIn.read(), ret);
} else if (c < 240) {
appendHex(c, ret);
appendHex(bIn.read(), ret);
appendHex(bIn.read(), ret);
}
}
c = bIn.read();
}
} catch (IOException ioe) {
System.out.println("urlEncode:"+ioe);
return s;
}
return ret.toString();
}

private static void appendHex(int arg0, StringBuffer buff) {
buff.append('%');
if (arg0 < 16) {
buff.append('0');
}
buff.append(Integer.toHexString(arg0));
}

最佳答案

根据 RFC 1738 , 没有空字符的 URL 编码。这给您留下了四个选择。

  1. 要求填写所有字段。这可能不是一个好的选择,具体取决于您的应用程序的用途,因为用户可能没有特定字段的数据,或者不想共享它。

  2. 如果只有一个字段可以留空,请重新排列 URL 参数,使其排在最后。这将导致 /joe/bloggs/ 而不是 /joe//bloggs

  3. 如果一个 URL 可能有多个空参数,最好使用查询字符串。这看起来像 /setName?firstname=joe&othername=&lastname=bloggs。可以省略或包含未使用的参数。

  4. 使用 POST 而不是 GET。只需使用 url /setName 并将所有字段放入表单中。根据 URL,显然正在执行的操作似乎更适合 POST 而不是 GET。

关于string - 在为 GET 请求编码参数时如何处理空字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12072461/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com