Amazon Services China
亚马逊商城网络服务(亚马逊 MWS)文档
亚马逊 MWS 文档

使用 Content-MD5 标头和 MD5 校验和

MD5 是一种计算任意长度数据的 128 位“摘要”(或哈希)的算法,数据的任何变化都会非常准确地反映在摘要的变化上。 当您提交上传数据时,可以创建 Content-MD5 标头。亚马逊MWS 将计算 MD5 校验和,并将其与发送的标头相比较,确保接收的上传数据在传输过程中没有出现错误。当亚马逊MWS 发送报告时,该过程是反向的。发送的报告会包含 Content-MD5 标头,您可以计算 MD5 校验和,并将其与亚马逊发送的标头相比较,确保您接收的报告在传输过程中没有出现错误。

亚马逊MWS 发送带有 Content-MD5 标头的上传数据时,基本过程如下:
  1. 将要提交的上传数据存储在磁盘上,然后再传输至亚马逊MWS
  2. 计算文件的 Content-MD5,并将它存储在一个辅助文件中。
  3. 创建 SubmitFeed 请求,向其传递存储的 Content-MD5,并将文件内容附加到数据流中。
  4. 提交请求。

以下 Java 代码示例描述了如何对提交到亚马逊的上传数据计算 Content-MD5:

/**
 * Calculate content MD5 header values for feeds stored on disk.
 */
public static String computeContentMD5HeaderValue( FileInputStream fis ) 
    throws IOException, NoSuchAlgorithmException {

    DigestInputStream dis = new DigestInputStream( fis,
        MessageDigest.getInstance( "MD5" ));

    byte[] buffer = new byte[8192];
    while( dis.read( buffer ) > 0 );

    String md5Content = new String(
        org.apache.commons.codec.binary.Base64.encodeBase64(
            dis.getMessageDigest().digest()) ); 

    // Effectively resets the stream to be beginning of the file
    // via a FileChannel.
    fis.getChannel().position( 0 );

    return md5Content;
}

以下 Java 代码示例描述了如何对下载的报告计算 MD5 校验和:

/**
 * Consume the stream and return its Base-64 encoded MD5 checksum.
 */
public static String computeContentMD5Header(InputStream inputStream) {
    // Consume the stream to compute the MD5 as a side effect.
    DigestInputStream s;
    try {
        s = new DigestInputStream(inputStream,
                                  MessageDigest.getInstance("MD5"));
        // drain the buffer, as the digest is computed as a side-effect
        byte[] buffer = new byte[8192];
        while(s.read(buffer) > 0);
        return new String(
            org.apache.commons.codec.binary.Base64.encodeBase64(
                s.getMessageDigest().digest()),
                "UTF-8");
    } catch (NoSuchAlgorithmException e) {
        throw new RuntimeException(e);
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}