在Grails Web应用程序中,我试图使用rest API将小号(指纹)字节数组从applet发布到服务器。
这是我为此尝试的
private String post(String purl,String customerId, byte[] regMin1,byte[] regMin2) throws Exception {
StringBuilder parameters = new StringBuilder();
parameters.append("customerId=");
parameters.append(customerId);
parameters.append("®Min1=");
parameters.append(URLEncoder.encode(new String(regMin1),"UTF-8"));
parameters.append("®Min2=");
parameters.append(URLEncoder.encode(new String(regMin2),"UTF-8"));
URL url = new URL(purl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.setRequestProperty("Content-Length",Integer.toString(parameters.toString().getBytes().length));
DataOutputStream wr = new DataOutputStream(connection.getOutputStream ());
wr.writeBytes(parameters.toString());
wr.flush();
wr.close();
BufferedReader in = new BufferedReader(new InputStreamReader(
connection.getInputStream()));
StringBuilder builder = new StringBuilder();
String aux = "";
while ((aux = in.readLine()) != null) {
builder.append(aux);
}
in.close();
connection.disconnect();
return builder.toString();
}
我可以成功发布regMin1,regMin2,但指纹验证总是失败。我怀疑,我是否正确发布。
答案 0 :(得分:5)
这对我来说是一个非常糟糕的主意:
parameters.append(URLEncoder.encode(new String(regMin1),"UTF-8"));
...
parameters.append(URLEncoder.encode(new String(regMin2),"UTF-8"));
如果regMin1
和regMin2
不是实际上 UTF-8文字(我的猜测是他们不是),那么你几乎肯定会在这里丢失数据
不要将任意二进制数据视为编码文本。
相反,将regMin1
和regMin2
转换为base64 - 这样您最终会得到ASCII字符,然后您可以在服务器上解码以明确获取原始二进制数据。您可以使用URL安全版本的base64,以避免进一步编码结果。
如果您没有其他任何东西可以使用,可以使用good public domain base64 library。例如:
parameters.append("®Min1=")
.append(Base64.encodeBytes(regMin1, Base64.URL_SAFE))
.append("®Min2=")
.append(Base64.encodeBytes(regMin2, Base64.URL_SAFE));
请注意,您还希望使用URL_SAFE
选项进行解码 - 不要只是尝试将其解码为“普通”base64数据。
(您可能仍希望将此转换为POST请求,如果您可以使用更好的HTTP库,那么您肯定会有更轻松的时间,但它们只是略有不同的问题。)