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

Vis*_*swa 1 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();
}   
Run Code Online (Sandbox Code Playgroud)

我可以成功发布regMin1,regMin2,但指纹验证总是失败.我怀疑,我是否正确发布.

Jon*_*eet 5

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

parameters.append(URLEncoder.encode(new String(regMin1),"UTF-8"));
...
parameters.append(URLEncoder.encode(new String(regMin2),"UTF-8"));
Run Code Online (Sandbox Code Playgroud)

如果regMin1并且实际上regMin2不是UTF-8文本(我猜他们不是),你几乎肯定会在这里丢失数据.

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

相反,转换regMin1regMin2为Base64 -这样你会用ASCII字符,然后可以解码服务器上肯定得到原始的二进制数据结束.您可以使用URL安全版本的base64,以避免进一步编码结果.

如果您没有其他任何东西,可以使用一个很好的公共域base64库.例如:

parameters.append("&regMin1=")
          .append(Base64.encodeBytes(regMin1, Base64.URL_SAFE))
          .append("&regMin2=")
          .append(Base64.encodeBytes(regMin2, Base64.URL_SAFE)); 
Run Code Online (Sandbox Code Playgroud)

请注意,您也希望使用该URL_SAFE选项进行解码- 不要只是尝试将其解码为"普通"base64数据.

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