从小程序向服务器发布细节字节数组

时间:2014-10-15 09:13:02

标签: java grails applet http-post fingerprint

在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("&regMin1=");
    parameters.append(URLEncoder.encode(new String(regMin1),"UTF-8"));
    parameters.append("&regMin2=");
    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,但指纹验证总是失败。我怀疑,我是否正确发布。

1 个答案:

答案 0 :(得分:5)

这对我来说是一个非常糟糕的主意:

parameters.append(URLEncoder.encode(new String(regMin1),"UTF-8"));
...
parameters.append(URLEncoder.encode(new String(regMin2),"UTF-8"));

如果regMin1regMin2不是实际上 UTF-8文字(我的猜测是他们不是),那么你几乎肯定会在这里丢失数据

不要将任意二进制数据视为编码文本。

相反,将regMin1regMin2转换为base64 - 这样您最终会得到ASCII字符,然后您可以在服务器上解码以明确获取原始二进制数据。您可以使用URL安全版本的base64,以避免进一步编码结果。

如果您没有其他任何东西可以使用,可以使用good public domain base64 library。例如:

parameters.append("&regMin1=")
          .append(Base64.encodeBytes(regMin1, Base64.URL_SAFE))
          .append("&regMin2=")
          .append(Base64.encodeBytes(regMin2, Base64.URL_SAFE)); 

请注意,您还希望使用URL_SAFE选项进行解码 - 不要只是尝试将其解码为“普通”base64数据。

(您可能仍希望将此转换为POST请求,如果您可以使用更好的HTTP库,那么您肯定会有更轻松的时间,但它们只是略有不同的问题。)