【问题标题】:Posting minutiae byte array from applet to server将细节字节数组从小程序发布到服务器
【发布时间】:2014-10-15 09:13:01
【问题描述】:

在 Grails Web 应用程序中,我正在尝试使用 REST API 将细节(指纹)字节数组从小程序发布到服务器。

这就是我尝试的目的

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 但指纹验证总是失败。我怀疑,我是否正确发布。

【问题讨论】:

  • 你为什么不用apache的HttpClient?有了它,您可以组装一个没有这种复杂性的 POST 请求
  • @injecteer 好的,我刚开始。谢谢。
  • @Viswa 你能发布你的 grails 代码吗?我想看看你是如何从那里获取数据的。
  • @Ramsharan 感谢您的关注.. 我明白了..

标签: java grails applet http-post fingerprint


【解决方案1】:

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

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

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

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

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

如果您手头没有其他东西,可以使用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 库,您肯定会更轻松,但它们是稍微不同的问题。)

【讨论】:

  • 谢谢@Jon Skeet .. 是的,我正在根据您的回答here 尝试使用Base64 .. URL_SAFE 是有用的信息.. 哇 Jon Skeet 回答了我的问题..
  • @Viswa:那么,它现在工作了吗?您还有什么需要了解的吗?
  • 是的。谢谢@Jon Skeet
  • 一个题外话“哪本书/资源对学习 java net & Collections 和线程概念有好处?”
  • @Viswa:我在这方面没有任何特别的建议,但请注意,Java 8 为使用 Streams 处理数据提供了许多新选项。
猜你喜欢
  • 1970-01-01
  • 2015-11-17
  • 2012-05-14
  • 1970-01-01
  • 2012-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多