OSSPostObject未發生回撥的問題排查

孫偉sw發表於2018-02-28

今天排查一個問題,走了一些彎路,總結一下,希望可以為後來者提供參考建議。

問題:

XX反饋,使用OSS PostObject的callback沒有發生回撥。但是通過putobject用同樣的callback是有回撥發生的。客戶懷疑我們的PostObject有問題。

排查:

OSS回撥流程為 客戶端->OSS->應用伺服器->客戶端
image.png
建立一臺ECS用於當測試應用伺服器
建立一個asp.net 的ashx,程式碼自行實現,用於獲取OSS callback引數。
寫了兩個上傳demo

  1. Putobject (SDK上有示例https://help.aliyun.com/document_detail/32013.html
PutObjectRequest putObjectRequest=new PutObjectRequest(bucketName, key, new ByteArrayInputStream(content.getBytes()), meta);
Callback callback = new Callback();
callback.setCallbackUrl("http://接收端IP/Revice.ashx");
callback.setCallbackBody("{\"mimeType\":${mimeType},\"size\":${size}}");
putObjectRequest.setCallback(callback);
        
ossClient.putObject(putObjectRequest)
  1. postobject(post demo,參考https://github.com/aliyun/aliyun-oss-java-sdk/blob/master/src/samples/PostObjectSample.java?spm=a2c4g.11186623.2.11.3bMYXb&file=PostObjectSample.java

關鍵程式碼:

File file = new File(localFile);
String filename = file.getName();
String contentType = new MimetypesFileTypeMap().getContentType(file);
if (contentType == null || contentType.equals("")) {
     contentType = "application/octet-stream";
}

StringBuffer strBuf = new StringBuffer();
strBuf.append("
").append("--").append(boundary).append("
");
strBuf.append("Content-Disposition: form-data; name="file"; "+ "filename="" + filename + ""
");
strBuf.append("Content-Type: " + contentType + "

");
out.write(strBuf.toString().getBytes());

//callback部分
StringBuffer strBuf1 = new StringBuffer();
String callback="{"callbackUrl":"http://應用接收端IP/Revice.ashx","callbackBody":"{\"bucket\"=${bucket},\"size\"=${size}}"}";
byte[] textByte = callback.getBytes("UTF-8");
strBuf1.append("
").append("--").append(boundary).append("
");
String callbackstr=new String(Base64.encodeBase64(textByte));
strBuf1.append("Content-Disposition: form-data; name="callback"

" + callbackstr  + "

");
out.write(strBuf1.toString().getBytes());
//callback部分
     
DataInputStream in = new DataInputStream(new FileInputStream(file));
int bytes = 0;
byte[] bufferOut = new byte[1024];
while ((bytes = in.read(bufferOut)) != -1) {
     out.write(bufferOut, 0, bytes);
}
in.close();

byte[] endData = ("
--" + boundary + "--
").getBytes();
out.write(endData);
out.flush();
out.close();

測試:

Put方式,應用伺服器上有OSS的回撥請求。
image.png

Post方式,應用伺服器無任何回撥請求
image.png
按理說,如果json格式有錯誤或者回撥失敗,都應該會返回對應的msg,而上傳後一切成功但為什麼沒有發生回撥呢,難道是bug?不太可能,如果是線上bug,工單早就爆了。

檢查程式碼和OSS後端同學溝通。檢查到在傳送請求時callback的引數是在file下面。
image.png
這樣就會作為file的一部分。調整一下位置
image.png
業務伺服器上也如願的抓到了請求
image.png

總結一下就是細心,還是細心。不要急躁多除錯,最終會得到想得到的。

附件附上完整的postobject callback java版程式碼


相關文章