作者:俏巴
概述
圖像識別服務(Image Recognition)基於大數據和深度學習實現,可精準識別圖像中的視覺內容,包括上千種物體標籤、數十種常見場景等,包含場景分類、圖像打標、鑑黃等在線API服務模塊,應用於智能相冊管理、圖片分類和檢索、圖片安全監控等場景。下面給出使用Java語言分別使用網絡圖片和本地圖片調用場景識別API的示例。
控制檯測試
與人臉識別類似,可以參考:阿里雲人臉識別使用流程簡介 。
Java Code Sample
使用網絡圖片測試
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.security.MessageDigest;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import javax.crypto.spec.SecretKeySpec;
import sun.misc.BASE64Encoder;
import javax.crypto.Mac;
//@SuppressWarnings("restriction")
public class ComputerDemo1 {
<span class="hljs-comment">/*
* 計算MD5+BASE64
*/</span>
public <span class="hljs-keyword">static</span> <span class="hljs-built_in">String</span> MD5Base64(<span class="hljs-built_in">String</span> s) {
<span class="hljs-keyword">if</span> (s == <span class="hljs-literal">null</span>)
<span class="hljs-keyword">return</span> <span class="hljs-literal">null</span>;
<span class="hljs-built_in">String</span> encodeStr = <span class="hljs-string">""</span>;
byte[] utfBytes = s.getBytes();
MessageDigest mdTemp;
<span class="hljs-keyword">try</span> {
mdTemp = MessageDigest.getInstance(<span class="hljs-string">"MD5"</span>);
mdTemp.update(utfBytes);
byte[] md5Bytes = mdTemp.digest();
BASE64Encoder b64Encoder = <span class="hljs-keyword">new</span> BASE64Encoder();
encodeStr = b64Encoder.encode(md5Bytes);
} <span class="hljs-keyword">catch</span> (Exception e) {
<span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Error</span>(<span class="hljs-string">"Failed to generate MD5 : "</span> + e.getMessage());
}
<span class="hljs-keyword">return</span> encodeStr;
}
<span class="hljs-comment">/*
* 計算 HMAC-SHA1
*/</span>
public <span class="hljs-keyword">static</span> <span class="hljs-built_in">String</span> HMACSha1(<span class="hljs-built_in">String</span> data, <span class="hljs-built_in">String</span> key) {
<span class="hljs-built_in">String</span> result;
<span class="hljs-keyword">try</span> {
SecretKeySpec signingKey = <span class="hljs-keyword">new</span> SecretKeySpec(key.getBytes(), <span class="hljs-string">"HmacSHA1"</span>);
Mac mac = Mac.getInstance(<span class="hljs-string">"HmacSHA1"</span>);
mac.init(signingKey);
byte[] rawHmac = mac.doFinal(data.getBytes());
result = (<span class="hljs-keyword">new</span> BASE64Encoder()).encode(rawHmac);
} <span class="hljs-keyword">catch</span> (Exception e) {
<span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Error</span>(<span class="hljs-string">"Failed to generate HMAC : "</span> + e.getMessage());
}
<span class="hljs-keyword">return</span> result;
}
<span class="hljs-comment">/*
* 等同於javaScript中的 new Date().toUTCString();
*/</span>
public <span class="hljs-keyword">static</span> <span class="hljs-built_in">String</span> toGMTString(<span class="hljs-built_in">Date</span> date) {
SimpleDateFormat df = <span class="hljs-keyword">new</span> SimpleDateFormat(<span class="hljs-string">"E, dd MMM yyyy HH:mm:ss z"</span>, Locale.UK);
df.setTimeZone(<span class="hljs-keyword">new</span> java.util.SimpleTimeZone(<span class="hljs-number">0</span>, <span class="hljs-string">"GMT"</span>));
<span class="hljs-keyword">return</span> df.format(date);
}
<span class="hljs-comment">/*
* 發送POST請求
*/</span>
public <span class="hljs-keyword">static</span> <span class="hljs-built_in">String</span> sendPost(<span class="hljs-built_in">String</span> url, <span class="hljs-built_in">String</span> body, <span class="hljs-built_in">String</span> ak_id, <span class="hljs-built_in">String</span> ak_secret) throws Exception {
PrintWriter out = <span class="hljs-literal">null</span>;
BufferedReader <span class="hljs-keyword">in</span> = <span class="hljs-literal">null</span>;
<span class="hljs-built_in">String</span> result = <span class="hljs-string">""</span>;
int statusCode = <span class="hljs-number">200</span>;
<span class="hljs-keyword">try</span> {
URL realUrl = <span class="hljs-keyword">new</span> URL(url);
<span class="hljs-comment">/*
* http header 參數
*/</span>
<span class="hljs-built_in">String</span> method = <span class="hljs-string">"POST"</span>;
<span class="hljs-built_in">String</span> accept = <span class="hljs-string">"application/json"</span>;
<span class="hljs-built_in">String</span> content_type = <span class="hljs-string">"application/json"</span>;
<span class="hljs-built_in">String</span> path = realUrl.getFile();
<span class="hljs-built_in">String</span> date = toGMTString(<span class="hljs-keyword">new</span> <span class="hljs-built_in">Date</span>());
<span class="hljs-comment">// 1.對body做MD5+BASE64加密</span>
<span class="hljs-built_in">String</span> bodyMd5 = MD5Base64(body);
<span class="hljs-built_in">String</span> stringToSign = method + <span class="hljs-string">"\n"</span> + accept + <span class="hljs-string">"\n"</span> + bodyMd5 + <span class="hljs-string">"\n"</span> + content_type + <span class="hljs-string">"\n"</span> + date + <span class="hljs-string">"\n"</span>
+ path;
<span class="hljs-comment">// 2.計算 HMAC-SHA1</span>
<span class="hljs-built_in">String</span> signature = HMACSha1(stringToSign, ak_secret);
<span class="hljs-comment">// 3.得到 authorization header</span>
<span class="hljs-built_in">String</span> authHeader = <span class="hljs-string">"Dataplus "</span> + ak_id + <span class="hljs-string">":"</span> + signature;
<span class="hljs-comment">// 打開和URL之間的連接</span>
URLConnection conn = realUrl.openConnection();
<span class="hljs-comment">// 設置通用的請求屬性</span>
conn.setRequestProperty(<span class="hljs-string">"accept"</span>, accept);
conn.setRequestProperty(<span class="hljs-string">"content-type"</span>, content_type);
conn.setRequestProperty(<span class="hljs-string">"date"</span>, date);
conn.setRequestProperty(<span class="hljs-string">"Authorization"</span>, authHeader);
<span class="hljs-comment">// 發送POST請求必須設置如下兩行</span>
conn.setDoOutput(<span class="hljs-literal">true</span>);
conn.setDoInput(<span class="hljs-literal">true</span>);
<span class="hljs-comment">// 獲取URLConnection對象對應的輸出流</span>
out = <span class="hljs-keyword">new</span> PrintWriter(conn.getOutputStream());
<span class="hljs-comment">// 發送請求參數</span>
out.print(body);
<span class="hljs-comment">// flush輸出流的緩衝</span>
out.flush();
<span class="hljs-comment">// 定義BufferedReader輸入流來讀取URL的響應</span>
statusCode = ((HttpURLConnection)conn).getResponseCode();
<span class="hljs-keyword">if</span>(statusCode != <span class="hljs-number">200</span>) {
<span class="hljs-keyword">in</span> = <span class="hljs-keyword">new</span> BufferedReader(<span class="hljs-keyword">new</span> InputStreamReader(((HttpURLConnection)conn).getErrorStream()));
} <span class="hljs-keyword">else</span> {
<span class="hljs-keyword">in</span> = <span class="hljs-keyword">new</span> BufferedReader(<span class="hljs-keyword">new</span> InputStreamReader(conn.getInputStream()));
}
<span class="hljs-built_in">String</span> line;
<span class="hljs-keyword">while</span> ((line = <span class="hljs-keyword">in</span>.readLine()) != <span class="hljs-literal">null</span>) {
result += line;
}
} <span class="hljs-keyword">catch</span> (Exception e) {
e.printStackTrace();
} <span class="hljs-keyword">finally</span> {
<span class="hljs-keyword">try</span> {
<span class="hljs-keyword">if</span> (out != <span class="hljs-literal">null</span>) {
out.close();
}
<span class="hljs-keyword">if</span> (<span class="hljs-keyword">in</span> != <span class="hljs-literal">null</span>) {
<span class="hljs-keyword">in</span>.close();
}
} <span class="hljs-keyword">catch</span> (IOException ex) {
ex.printStackTrace();
}
}
<span class="hljs-keyword">if</span> (statusCode != <span class="hljs-number">200</span>) {
<span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> IOException(<span class="hljs-string">"\nHttp StatusCode: "</span>+ statusCode + <span class="hljs-string">"\nErrorMessage: "</span> + result);
}
<span class="hljs-keyword">return</span> result;
}
<span class="hljs-comment">/*
* GET請求
*/</span>
public <span class="hljs-keyword">static</span> <span class="hljs-built_in">String</span> sendGet(<span class="hljs-built_in">String</span> url, <span class="hljs-built_in">String</span> ak_id, <span class="hljs-built_in">String</span> ak_secret) throws Exception {
<span class="hljs-built_in">String</span> result = <span class="hljs-string">""</span>;
BufferedReader <span class="hljs-keyword">in</span> = <span class="hljs-literal">null</span>;
int statusCode = <span class="hljs-number">200</span>;
<span class="hljs-keyword">try</span> {
URL realUrl = <span class="hljs-keyword">new</span> URL(url);
<span class="hljs-comment">/*
* http header 參數
*/</span>
<span class="hljs-built_in">String</span> method = <span class="hljs-string">"GET"</span>;
<span class="hljs-built_in">String</span> accept = <span class="hljs-string">"application/json"</span>;
<span class="hljs-built_in">String</span> content_type = <span class="hljs-string">"application/json"</span>;
<span class="hljs-built_in">String</span> path = realUrl.getFile();
<span class="hljs-built_in">String</span> date = toGMTString(<span class="hljs-keyword">new</span> <span class="hljs-built_in">Date</span>());
<span class="hljs-comment">// 1.對body做MD5+BASE64加密</span>
<span class="hljs-comment">// String bodyMd5 = MD5Base64(body);</span>
<span class="hljs-built_in">String</span> stringToSign = method + <span class="hljs-string">"\n"</span> + accept + <span class="hljs-string">"\n"</span> + <span class="hljs-string">""</span> + <span class="hljs-string">"\n"</span> + content_type + <span class="hljs-string">"\n"</span> + date + <span class="hljs-string">"\n"</span> + path;
<span class="hljs-comment">// 2.計算 HMAC-SHA1</span>
<span class="hljs-built_in">String</span> signature = HMACSha1(stringToSign, ak_secret);
<span class="hljs-comment">// 3.得到 authorization header</span>
<span class="hljs-built_in">String</span> authHeader = <span class="hljs-string">"Dataplus "</span> + ak_id + <span class="hljs-string">":"</span> + signature;
<span class="hljs-comment">// 打開和URL之間的連接</span>
URLConnection connection = realUrl.openConnection();
<span class="hljs-comment">// 設置通用的請求屬性</span>
connection.setRequestProperty(<span class="hljs-string">"accept"</span>, accept);
connection.setRequestProperty(<span class="hljs-string">"content-type"</span>, content_type);
connection.setRequestProperty(<span class="hljs-string">"date"</span>, date);
connection.setRequestProperty(<span class="hljs-string">"Authorization"</span>, authHeader);
connection.setRequestProperty(<span class="hljs-string">"Connection"</span>, <span class="hljs-string">"keep-alive"</span>);
<span class="hljs-comment">// 建立實際的連接</span>
connection.connect();
<span class="hljs-comment">// 定義 BufferedReader輸入流來讀取URL的響應</span>
statusCode = ((HttpURLConnection)connection).getResponseCode();
<span class="hljs-keyword">if</span>(statusCode != <span class="hljs-number">200</span>) {
<span class="hljs-keyword">in</span> = <span class="hljs-keyword">new</span> BufferedReader(<span class="hljs-keyword">new</span> InputStreamReader(((HttpURLConnection)connection).getErrorStream()));
} <span class="hljs-keyword">else</span> {
<span class="hljs-keyword">in</span> = <span class="hljs-keyword">new</span> BufferedReader(<span class="hljs-keyword">new</span> InputStreamReader(connection.getInputStream()));
}
<span class="hljs-built_in">String</span> line;
<span class="hljs-keyword">while</span> ((line = <span class="hljs-keyword">in</span>.readLine()) != <span class="hljs-literal">null</span>) {
result += line;
}
} <span class="hljs-keyword">catch</span> (Exception e) {
e.printStackTrace();
} <span class="hljs-keyword">finally</span> {
<span class="hljs-keyword">try</span> {
<span class="hljs-keyword">if</span> (<span class="hljs-keyword">in</span> != <span class="hljs-literal">null</span>) {
<span class="hljs-keyword">in</span>.close();
}
} <span class="hljs-keyword">catch</span> (Exception e) {
e.printStackTrace();
}
}
<span class="hljs-keyword">if</span> (statusCode != <span class="hljs-number">200</span>) {
<span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> IOException(<span class="hljs-string">"\nHttp StatusCode: "</span>+ statusCode + <span class="hljs-string">"\nErrorMessage: "</span> + result);
}
<span class="hljs-keyword">return</span> result;
}
public <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> main(<span class="hljs-built_in">String</span>[] args) throws Exception {
<span class="hljs-comment">// 發送POST請求示例</span>
<span class="hljs-built_in">String</span> ak_id = <span class="hljs-string">"********"</span>; <span class="hljs-comment">//用戶ak</span>
<span class="hljs-built_in">String</span> ak_secret = <span class="hljs-string">"********"</span>; <span class="hljs-comment">// 用戶ak_secret</span>
<span class="hljs-built_in">String</span> url = <span class="hljs-string">"https://dtplus-cn-shanghai.data.aliyuncs.com/image/scene"</span>;
<span class="hljs-built_in">String</span> body = <span class="hljs-string">"{\"type\": \"0\", \"image_url\":\"https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&quality=100&size=b4000_4000&sec=1544608444&di=54513735567736d0eaeba7a13aa0421c&src=http://img5q.duitang.com/uploads/item/201411/23/20141123205812_Bircn.jpeg\"}"</span>;
System.out.println(<span class="hljs-string">"response body:"</span> + sendPost(url, body, ak_id, ak_secret));
}
}
使用本地圖片測試
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.security.MessageDigest;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import javax.crypto.spec.SecretKeySpec;
import sun.misc.BASE64Encoder;
import javax.crypto.Mac;
public class ComputerDemo2 {
<span class="hljs-comment">/*
* 計算MD5+BASE64
*/</span>
public <span class="hljs-keyword">static</span> <span class="hljs-built_in">String</span> MD5Base64(<span class="hljs-built_in">String</span> s) {
<span class="hljs-keyword">if</span> (s == <span class="hljs-literal">null</span>)
<span class="hljs-keyword">return</span> <span class="hljs-literal">null</span>;
<span class="hljs-built_in">String</span> encodeStr = <span class="hljs-string">""</span>;
byte[] utfBytes = s.getBytes();
MessageDigest mdTemp;
<span class="hljs-keyword">try</span> {
mdTemp = MessageDigest.getInstance(<span class="hljs-string">"MD5"</span>);
mdTemp.update(utfBytes);
byte[] md5Bytes = mdTemp.digest();
BASE64Encoder b64Encoder = <span class="hljs-keyword">new</span> BASE64Encoder();
encodeStr = b64Encoder.encode(md5Bytes);
} <span class="hljs-keyword">catch</span> (Exception e) {
<span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Error</span>(<span class="hljs-string">"Failed to generate MD5 : "</span> + e.getMessage());
}
<span class="hljs-keyword">return</span> encodeStr;
}
<span class="hljs-comment">/*
* 計算 HMAC-SHA1
*/</span>
public <span class="hljs-keyword">static</span> <span class="hljs-built_in">String</span> HMACSha1(<span class="hljs-built_in">String</span> data, <span class="hljs-built_in">String</span> key) {
<span class="hljs-built_in">String</span> result;
<span class="hljs-keyword">try</span> {
SecretKeySpec signingKey = <span class="hljs-keyword">new</span> SecretKeySpec(key.getBytes(), <span class="hljs-string">"HmacSHA1"</span>);
Mac mac = Mac.getInstance(<span class="hljs-string">"HmacSHA1"</span>);
mac.init(signingKey);
byte[] rawHmac = mac.doFinal(data.getBytes());
result = (<span class="hljs-keyword">new</span> BASE64Encoder()).encode(rawHmac);
} <span class="hljs-keyword">catch</span> (Exception e) {
<span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Error</span>(<span class="hljs-string">"Failed to generate HMAC : "</span> + e.getMessage());
}
<span class="hljs-keyword">return</span> result;
}
<span class="hljs-comment">/*
* 等同於javaScript中的 new Date().toUTCString();
*/</span>
public <span class="hljs-keyword">static</span> <span class="hljs-built_in">String</span> toGMTString(<span class="hljs-built_in">Date</span> date) {
SimpleDateFormat df = <span class="hljs-keyword">new</span> SimpleDateFormat(<span class="hljs-string">"E, dd MMM yyyy HH:mm:ss z"</span>, Locale.UK);
df.setTimeZone(<span class="hljs-keyword">new</span> java.util.SimpleTimeZone(<span class="hljs-number">0</span>, <span class="hljs-string">"GMT"</span>));
<span class="hljs-keyword">return</span> df.format(date);
}
<span class="hljs-comment">/*
* 發送POST請求
*/</span>
public <span class="hljs-keyword">static</span> <span class="hljs-built_in">String</span> sendPost(<span class="hljs-built_in">String</span> url, <span class="hljs-built_in">String</span> body, <span class="hljs-built_in">String</span> ak_id, <span class="hljs-built_in">String</span> ak_secret) throws Exception {
PrintWriter out = <span class="hljs-literal">null</span>;
BufferedReader <span class="hljs-keyword">in</span> = <span class="hljs-literal">null</span>;
<span class="hljs-built_in">String</span> result = <span class="hljs-string">""</span>;
int statusCode = <span class="hljs-number">200</span>;
<span class="hljs-keyword">try</span> {
URL realUrl = <span class="hljs-keyword">new</span> URL(url);
<span class="hljs-comment">/*
* http header 參數
*/</span>
<span class="hljs-built_in">String</span> method = <span class="hljs-string">"POST"</span>;
<span class="hljs-built_in">String</span> accept = <span class="hljs-string">"application/json"</span>;
<span class="hljs-built_in">String</span> content_type = <span class="hljs-string">"application/json"</span>;
<span class="hljs-built_in">String</span> path = realUrl.getFile();
<span class="hljs-built_in">String</span> date = toGMTString(<span class="hljs-keyword">new</span> <span class="hljs-built_in">Date</span>());
<span class="hljs-comment">// 1.對body做MD5+BASE64加密</span>
<span class="hljs-built_in">String</span> bodyMd5 = MD5Base64(body);
<span class="hljs-built_in">String</span> stringToSign = method + <span class="hljs-string">"\n"</span> + accept + <span class="hljs-string">"\n"</span> + bodyMd5 + <span class="hljs-string">"\n"</span> + content_type + <span class="hljs-string">"\n"</span> + date + <span class="hljs-string">"\n"</span>
+ path;
<span class="hljs-comment">// 2.計算 HMAC-SHA1</span>
<span class="hljs-built_in">String</span> signature = HMACSha1(stringToSign, ak_secret);
<span class="hljs-comment">// 3.得到 authorization header</span>
<span class="hljs-built_in">String</span> authHeader = <span class="hljs-string">"Dataplus "</span> + ak_id + <span class="hljs-string">":"</span> + signature;
<span class="hljs-comment">// 打開和URL之間的連接</span>
URLConnection conn = realUrl.openConnection();
<span class="hljs-comment">// 設置通用的請求屬性</span>
conn.setRequestProperty(<span class="hljs-string">"accept"</span>, accept);
conn.setRequestProperty(<span class="hljs-string">"content-type"</span>, content_type);
conn.setRequestProperty(<span class="hljs-string">"date"</span>, date);
conn.setRequestProperty(<span class="hljs-string">"Authorization"</span>, authHeader);
<span class="hljs-comment">// 發送POST請求必須設置如下兩行</span>
conn.setDoOutput(<span class="hljs-literal">true</span>);
conn.setDoInput(<span class="hljs-literal">true</span>);
<span class="hljs-comment">// 獲取URLConnection對象對應的輸出流</span>
out = <span class="hljs-keyword">new</span> PrintWriter(conn.getOutputStream());
<span class="hljs-comment">// 發送請求參數</span>
out.print(body);
<span class="hljs-comment">// flush輸出流的緩衝</span>
out.flush();
<span class="hljs-comment">// 定義BufferedReader輸入流來讀取URL的響應</span>
statusCode = ((HttpURLConnection)conn).getResponseCode();
<span class="hljs-keyword">if</span>(statusCode != <span class="hljs-number">200</span>) {
<span class="hljs-keyword">in</span> = <span class="hljs-keyword">new</span> BufferedReader(<span class="hljs-keyword">new</span> InputStreamReader(((HttpURLConnection)conn).getErrorStream()));
} <span class="hljs-keyword">else</span> {
<span class="hljs-keyword">in</span> = <span class="hljs-keyword">new</span> BufferedReader(<span class="hljs-keyword">new</span> InputStreamReader(conn.getInputStream()));
}
<span class="hljs-built_in">String</span> line;
<span class="hljs-keyword">while</span> ((line = <span class="hljs-keyword">in</span>.readLine()) != <span class="hljs-literal">null</span>) {
result += line;
}
} <span class="hljs-keyword">catch</span> (Exception e) {
e.printStackTrace();
} <span class="hljs-keyword">finally</span> {
<span class="hljs-keyword">try</span> {
<span class="hljs-keyword">if</span> (out != <span class="hljs-literal">null</span>) {
out.close();
}
<span class="hljs-keyword">if</span> (<span class="hljs-keyword">in</span> != <span class="hljs-literal">null</span>) {
<span class="hljs-keyword">in</span>.close();
}
} <span class="hljs-keyword">catch</span> (IOException ex) {
ex.printStackTrace();
}
}
<span class="hljs-keyword">if</span> (statusCode != <span class="hljs-number">200</span>) {
<span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> IOException(<span class="hljs-string">"\nHttp StatusCode: "</span>+ statusCode + <span class="hljs-string">"\nErrorMessage: "</span> + result);
}
<span class="hljs-keyword">return</span> result;
}
<span class="hljs-comment">/*
* GET請求
*/</span>
public <span class="hljs-keyword">static</span> <span class="hljs-built_in">String</span> sendGet(<span class="hljs-built_in">String</span> url, <span class="hljs-built_in">String</span> ak_id, <span class="hljs-built_in">String</span> ak_secret) throws Exception {
<span class="hljs-built_in">String</span> result = <span class="hljs-string">""</span>;
BufferedReader <span class="hljs-keyword">in</span> = <span class="hljs-literal">null</span>;
int statusCode = <span class="hljs-number">200</span>;
<span class="hljs-keyword">try</span> {
URL realUrl = <span class="hljs-keyword">new</span> URL(url);
<span class="hljs-comment">/*
* http header 參數
*/</span>
<span class="hljs-built_in">String</span> method = <span class="hljs-string">"GET"</span>;
<span class="hljs-built_in">String</span> accept = <span class="hljs-string">"application/json"</span>;
<span class="hljs-built_in">String</span> content_type = <span class="hljs-string">"application/json"</span>;
<span class="hljs-built_in">String</span> path = realUrl.getFile();
<span class="hljs-built_in">String</span> date = toGMTString(<span class="hljs-keyword">new</span> <span class="hljs-built_in">Date</span>());
<span class="hljs-comment">// 1.對body做MD5+BASE64加密</span>
<span class="hljs-comment">// String bodyMd5 = MD5Base64(body);</span>
<span class="hljs-built_in">String</span> stringToSign = method + <span class="hljs-string">"\n"</span> + accept + <span class="hljs-string">"\n"</span> + <span class="hljs-string">""</span> + <span class="hljs-string">"\n"</span> + content_type + <span class="hljs-string">"\n"</span> + date + <span class="hljs-string">"\n"</span> + path;
<span class="hljs-comment">// 2.計算 HMAC-SHA1</span>
<span class="hljs-built_in">String</span> signature = HMACSha1(stringToSign, ak_secret);
<span class="hljs-comment">// 3.得到 authorization header</span>
<span class="hljs-built_in">String</span> authHeader = <span class="hljs-string">"Dataplus "</span> + ak_id + <span class="hljs-string">":"</span> + signature;
<span class="hljs-comment">// 打開和URL之間的連接</span>
URLConnection connection = realUrl.openConnection();
<span class="hljs-comment">// 設置通用的請求屬性</span>
connection.setRequestProperty(<span class="hljs-string">"accept"</span>, accept);
connection.setRequestProperty(<span class="hljs-string">"content-type"</span>, content_type);
connection.setRequestProperty(<span class="hljs-string">"date"</span>, date);
connection.setRequestProperty(<span class="hljs-string">"Authorization"</span>, authHeader);
connection.setRequestProperty(<span class="hljs-string">"Connection"</span>, <span class="hljs-string">"keep-alive"</span>);
<span class="hljs-comment">// 建立實際的連接</span>
connection.connect();
<span class="hljs-comment">// 定義 BufferedReader輸入流來讀取URL的響應</span>
statusCode = ((HttpURLConnection)connection).getResponseCode();
<span class="hljs-keyword">if</span>(statusCode != <span class="hljs-number">200</span>) {
<span class="hljs-keyword">in</span> = <span class="hljs-keyword">new</span> BufferedReader(<span class="hljs-keyword">new</span> InputStreamReader(((HttpURLConnection)connection).getErrorStream()));
} <span class="hljs-keyword">else</span> {
<span class="hljs-keyword">in</span> = <span class="hljs-keyword">new</span> BufferedReader(<span class="hljs-keyword">new</span> InputStreamReader(connection.getInputStream()));
}
<span class="hljs-built_in">String</span> line;
<span class="hljs-keyword">while</span> ((line = <span class="hljs-keyword">in</span>.readLine()) != <span class="hljs-literal">null</span>) {
result += line;
}
} <span class="hljs-keyword">catch</span> (Exception e) {
e.printStackTrace();
} <span class="hljs-keyword">finally</span> {
<span class="hljs-keyword">try</span> {
<span class="hljs-keyword">if</span> (<span class="hljs-keyword">in</span> != <span class="hljs-literal">null</span>) {
<span class="hljs-keyword">in</span>.close();
}
} <span class="hljs-keyword">catch</span> (Exception e) {
e.printStackTrace();
}
}
<span class="hljs-keyword">if</span> (statusCode != <span class="hljs-number">200</span>) {
<span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> IOException(<span class="hljs-string">"\nHttp StatusCode: "</span>+ statusCode + <span class="hljs-string">"\nErrorMessage: "</span> + result);
}
<span class="hljs-keyword">return</span> result;
}
public <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> main(<span class="hljs-built_in">String</span>[] args) throws Exception {
<span class="hljs-comment">// 發送POST請求示例</span>
<span class="hljs-built_in">String</span> ak_id = <span class="hljs-string">"********"</span>; <span class="hljs-comment">//用戶ak</span>
<span class="hljs-built_in">String</span> ak_secret = <span class="hljs-string">"********"</span>; <span class="hljs-comment">// 用戶ak_secret</span>
<span class="hljs-built_in">String</span> url = <span class="hljs-string">"https://dtplus-cn-shanghai.data.aliyuncs.com/image/scene"</span>;
<span class="hljs-comment">//上傳本地圖片</span>
<span class="hljs-comment">// Request body</span>
<span class="hljs-built_in">String</span> pic_path = <span class="hljs-string">"C:\\Users\\taro.yt\\Desktop\\timg.jpg"</span>;
File picBase64 = <span class="hljs-keyword">new</span> File(pic_path);
<span class="hljs-built_in">String</span> pic = encodeImageToBase64(picBase64);
<span class="hljs-comment">//提出base64編碼的換行符問題</span>
<span class="hljs-built_in">String</span> data = pic.replaceAll(<span class="hljs-string">"[\\s*\t\n\r]"</span>, <span class="hljs-string">""</span>);
data = <span class="hljs-string">"'"</span> + data + <span class="hljs-string">"'"</span>;
<span class="hljs-built_in">String</span> body = <span class="hljs-string">"{\"type\": \"1\", \"content\":"</span>+data+<span class="hljs-string">"}"</span>;
System.out.println(<span class="hljs-string">"response body:"</span> + sendPost(url, body, ak_id, ak_secret));
}
<span class="hljs-comment">/**
* 將本地圖片編碼為base64
*
* @param file
* @return
* @throws Exception
*/</span>
public <span class="hljs-keyword">static</span> <span class="hljs-built_in">String</span> encodeImageToBase64(File file) throws Exception {
<span class="hljs-comment">//將圖片文件轉化為字節數組字符串,並對其進行Base64編碼處理</span>
// loggerger.info("圖片的路徑為:" + file.getAbsolutePath());
InputStream <span class="hljs-keyword">in</span> = <span class="hljs-literal">null</span>;
byte[] data = <span class="hljs-literal">null</span>;
<span class="hljs-comment">//讀取圖片字節數組</span>
<span class="hljs-keyword">try</span> {
<span class="hljs-keyword">in</span> = <span class="hljs-keyword">new</span> FileInputStream(file);
data = <span class="hljs-keyword">new</span> byte[<span class="hljs-keyword">in</span>.available()];
<span class="hljs-keyword">in</span>.read(data);
<span class="hljs-keyword">in</span>.close();
} <span class="hljs-keyword">catch</span> (IOException e) {
e.printStackTrace();
<span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> Exception(<span class="hljs-string">"圖片上傳失敗,請聯繫客服!"</span>);
}
<span class="hljs-comment">//對字節數組Base64編碼</span>
BASE64Encoder encoder = <span class="hljs-keyword">new</span> BASE64Encoder();
<span class="hljs-built_in">String</span> base64 = encoder.encode(data);
<span class="hljs-keyword">return</span> base64;<span class="hljs-comment">//返回Base64編碼過的字節數組字符串</span>
}
}
測試結果
response body:{"tags":[{"value":"人物","confidence":97.0},{"value":"演出","confidence":12.0},{"value":"其他","confidence":12.0},{"value":"室內","confidence":11.0}],"errno":0,"request_id":"b31aebed-305a-4377-a843-ac4e9d3d30c1"}