500错误 - 使用AcrCloud RESTful api上传音频文件

时间:2015-08-25 21:07:28

标签: java http-post

我使用audio fileaudio & video bucket上传到名为demo的{​​{1}}。我得到AcrCloud RESTful services。这表明我的500 Internal Server Error(我在signature is correct时获得了422。我怀疑不正确的部分是构建多部分职位要求

我的代码:

signature was incorrect

我从import com.xperiel.common.logging.Loggers; import com.google.api.client.http.ByteArrayContent; import com.google.api.client.http.GenericUrl; import com.google.api.client.http.HttpContent; import com.google.api.client.http.HttpHeaders; import com.google.api.client.http.HttpMediaType; import com.google.api.client.http.HttpRequestFactory; import com.google.api.client.http.HttpResponse; import com.google.api.client.http.MultipartContent; import com.google.api.client.http.MultipartContent.Part; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.common.collect.ImmutableMap; import com.google.common.io.BaseEncoding; import com.google.common.io.CharStreams; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.util.Map.Entry; import java.util.logging.Level; import java.util.logging.Logger; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; public class TestAcrCloudSignature { private static final String ACCESS_KEY = "xxxx"; // confidential private static final String SECRET_KEY = "yyyy"; // confidential private static final String URL = "https://api.acrcloud.com/v1/audios"; private static HttpRequestFactory requestFactory = new NetHttpTransport().createRequestFactory(); private static final Logger logger = Loggers.getLogger(); public static void main(String [] args) { String filePath = "/Users/serena/Desktop/ArcCloudMusic/Fernando.m4a"; String httpMethod = HttpMethod.POST.toString(); String httpUri = "/v1/audios"; String signatureVersion = "1"; long timestamp = System.currentTimeMillis(); String stringToSign = getStringToSign(httpMethod, httpUri, signatureVersion, timestamp); String signature = getSignature(stringToSign); logger.log(Level.INFO, "Timestamp:\t" + timestamp); HttpResponse response = null; try { ImmutableMap<String, String> params = ImmutableMap.of( "title", "fernando", "audio_id", "1", "bucket_name", "demo", "data_type", "audio"); byte[] audio = getAudioFileTo(filePath); String strResponse = sendMultiPartPostRequest( "", params, ImmutableMap.of("audio-file", new Pair<>("Fernando.m4a", audio)), signatureVersion, signature, timestamp); logger.log(Level.INFO, "RESPONSE:" + strResponse); } catch (Exception e) { logger.log(Level.WARNING, "Response: " + response); logger.log(Level.WARNING, "Exception: " + e.getMessage()); e.printStackTrace(); } } private static String getStringToSign(String method, String httpUri, String signatureVersion, long timestamp) { String stringToSign = method+"\n"+httpUri+"\n"+ACCESS_KEY+"\n"+signatureVersion+"\n"+timestamp; logger.log(Level.INFO, "String to Sign:\t" + stringToSign); return stringToSign; } private static String getSignature(String stringToSign) { String signature = BaseEncoding.base64().encode(hmacSha1(stringToSign)); logger.log(Level.INFO, "Signature:\t" + signature); return signature; } private static byte[] hmacSha1(String toSign) { try { Mac mac = Mac.getInstance("HmacSHA1"); mac.init(new SecretKeySpec(SECRET_KEY.getBytes(), "HmacSHA1")); return mac.doFinal(toSign.getBytes()); } catch (NoSuchAlgorithmException | InvalidKeyException e) { throw new RuntimeException(e); } } private enum HttpMethod { GET, POST, PUT, DELETE, } private static byte[] getAudioFileTo(String filePath){ File file = new File(filePath); byte[] buffer = null; try { InputStream fis = new FileInputStream(file); buffer = new byte[(int) file.length()]; fis.read(buffer, 0, buffer.length); fis.close(); } catch (IOException e) { logger.log(Level.WARNING, "IOException: " + e.getMessage()); } return buffer; } private static String sendMultiPartPostRequest( String path, ImmutableMap<String, String> parameters, ImmutableMap<String, Pair<String, byte[]>> blobData, String signatureVersion, String signature, long timestamp) { try { MultipartContent multipartContent = new MultipartContent(); multipartContent.setMediaType(new HttpMediaType("multipart/form-data")); multipartContent.setBoundary("--------------------------0e94e468d6023641"); for (Entry<String, String> currentParameter : parameters.entrySet()) { HttpHeaders headers = new HttpHeaders(); headers.clear(); headers.setAcceptEncoding(null); headers.set("Content-Disposition", "form-data; name=\"" + currentParameter.getKey() + '\"'); HttpContent content = new ByteArrayContent(null, currentParameter.getValue().getBytes()); Part part = new Part(content); part.setHeaders(headers); multipartContent.addPart(part); } for (Entry<String, Pair<String, byte[]>> current : blobData.entrySet()) { ByteArrayContent currentContent = new ByteArrayContent("application/octet-stream", current.getValue().second); HttpHeaders headers = new HttpHeaders(); headers.clear(); headers.setAcceptEncoding(null); headers.set("Content-Disposition", "form-data; name=\"" + current.getKey() + "\"; filename=\"" + current.getValue().first + '\"'); headers.setContentType("application/octet-stream"); multipartContent.addPart(new Part(headers, currentContent)); } ByteArrayOutputStream out = new ByteArrayOutputStream(); multipartContent.writeTo(out); HttpResponse response = requestFactory .buildPostRequest(new GenericUrl(URL + path), multipartContent) .setHeaders(new HttpHeaders() .set("access-key", ACCESS_KEY) .set("signature-version", signatureVersion) .set("signature", signature) .set("timestamp", timestamp)) .execute(); String responseString = CharStreams.toString(new InputStreamReader(response.getContent())); return responseString; } catch (IOException e) { throw new RuntimeException(e); } } private static class Pair<A, B> { final A first; final B second; Pair(A first, B second) { this.first = first; this.second = second; } } } 获得的error message是:

  

500

     

{&#34; name&#34;:&#34; Internal Server Error&#34;,&#34; message&#34;:&#34;服务器出错。&#34;, &#34;代码&#34;:0,&#34;状态&#34; 500}

我可以使用此AcrCloud上传音频文件:

  

命令:$ curl -H&#34; access-key:xxxx&#34; -H&#34;签名版本:1&#34; -H   &#34;时间戳:1439958502089&#34; -H&#34;签名:   Nom6oajEzon260F2WzLpK3PE9e0 =&#34; -F&#34; title = fernando&#34; -F&#34; audio_id = 100&#34; -F   &#34; BUCKET_NAME =演示&#34; -F&#34; data_type = audio&#34; -F   &#34; audio_file = @ /用户/德拉塞雷纳/桌面/ ArcCloudMusic / Fernando.m4a&#34;   https://api.acrcloud.com/v1/audios

有人对cUrl command有任何提示吗?或者是否有人成功地使用Java以编程方式使用此服务?或者有人可以告诉我如何打印HttpPOST请求的内容?

  

UPDATE 我也试过在GITHUB上使用他们的java示例:

     

https://github.com/acrcloud/webapi_example/blob/master/RESTful%20service/UploadAudios.java

我得到相同的how to debug this

  

更新我在运行代码时不再获得500 error。我摆弄了apache jar版本,现在我可以成功使用git hub上的java代码了。为了记录,我使用的使用github代码的版本是apache-http-codec-1.10,apache-http-client-4.5,apache-http-core-4.4.1,apache-http-mime-4.5。 当我使用apache-http-core-4.5时,它无效。

     

UPDATE 我编写了一个文件,打印出上面github引用上的java代码生成的签名,以及我自己的代码。签名匹配,所以我确信我正在构建多部分帖子请求的方式问题。我还将两个帖子请求的内容写入文件,标题包含几个点的不同信息。

1 个答案:

答案 0 :(得分:0)

感谢Serena的耐心,我们的团队正在对代码和apache jar进行详细分析。希望很快会有更新。

目前,如果遇到同样问题的人,请使用https://github.com/acrcloud/webapi_example/blob/master/RESTful%20service/UploadAudios.java

中提到的以下罐子
// import commons-codec-<version>.jar, download from http://commons.apache.org/proper/commons-codec/download_codec.cgi
import org.apache.commons.codec.binary.Base64;

// import HttpClient,  download from http://hc.apache.org/downloads.cgi
/**
 *   
 *   commons-codec-1.1*.jar
 *   commons-logging-1.*.jar
 *   httpclient-4.*.jar
 *   httpcore-4.4.1.jar
 *   httpmime-4.*.jar
 * 
 * */