我嘗試在Android上調用騰訊OCR通用印刷體API(https://cloud.tencent.com/doc...
鑒權簽名如下:
package com.hsare.tools;
import android.annotation.TargetApi;
import android.os.Build;
import android.util.Base64;
import java.util.Random;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
public class Sign {
/**
* 生成 Authorization 簽名字段
*
* @param appId
* @param secretId
* @param secretKey
* @param bucketName
* @param expired
* @return
* @throws Exception
*/
public static String appSign(long appId, String secretId, String secretKey, String bucketName,
long expired) throws Exception {
long now = System.currentTimeMillis() / 1000;
int rdm = Math.abs(new Random().nextInt());
String plainText = String.format("a=%d&b=%s&k=%s&e=%d&t=%d&r=%d", appId, bucketName,
secretId, now, now + expired, rdm);
byte[] hmacDigest = HmacSha1(plainText, secretKey);
byte[] signContent = new byte[hmacDigest.length + plainText.getBytes().length];
System.arraycopy(hmacDigest, 0, signContent, 0, hmacDigest.length);
System.arraycopy(plainText.getBytes(), 0, signContent, hmacDigest.length,
plainText.getBytes().length);
return Base64Encode(signContent);
}
/**
* 生成 base64 編碼
*
* @param binaryData
* @return
*/
@TargetApi(Build.VERSION_CODES.O)
public static String Base64Encode(byte[] binaryData) {
String encodedstr = Base64.encodeToString(binaryData, Base64.NO_WRAP);//解
return encodedstr;
}
/**
* 生成 hmacsha1 簽名
*
* @param binaryData
* @param key
* @return
* @throws Exception
*/
public static byte[] HmacSha1(byte[] binaryData, String key) throws Exception {
Mac mac = Mac.getInstance("HmacSHA1");
SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(), "HmacSHA1");
mac.init(secretKey);
byte[] HmacSha1Digest = mac.doFinal(binaryData);
return HmacSha1Digest;
}
/**
* 生成 hmacsha1 簽名
*
* @param plainText
* @param key
* @return
* @throws Exception
*/
public static byte[] HmacSha1(String plainText, String key) throws Exception {
return HmacSha1(plainText.getBytes(), key);
}
}
post請求代碼如下:
package com.hsare.ocrtest;
import android.os.Looper;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Toast;
import com.hsare.tools.Config;
import com.hsare.tools.Sign;
import java.io.IOException;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "SSSSSSSSSSSSSS:";
private String sign = "";
private String url1 = "https://recognition.image.myqcloud.com/ocr/general";
private String url2 = "https://www.yanshishuo.com/wp-content/uploads/2017/09/gao.jpg";
OkHttpClient client = new OkHttpClient();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
//post 請求
public void doPost(View view) {
OkHttpClient client = new OkHttpClient();
try {
//鑒權簽名
sign = Sign.appSign(Config.APPID, Config.SECRETID, Config.SECRETKEY, "sd", 1);
} catch (Exception e) {
e.printStackTrace();
}
//請求參數(shù)
FormBody formBody = new FormBody.Builder()
.add("appid", "1251169844")
.add("url",url2)
.build();
Log.e(TAG, "sign: "+sign );
//請求頭
Request request = new Request.Builder()
.post(formBody)
.url(url2)
.addHeader("host","recognition.image.myqcloud.com")
.addHeader("content-type","application/json")
.addHeader("authorization",sign)
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.e(TAG, "onFailure: ", e);
}
@Override
public void onResponse(Call call, final Response response) throws IOException {
new Thread() {
@Override
public void run() {
Looper.prepare();
Log.e(TAG, "response: "+response );
Looper.loop();
}
}.start();
}
});
}
}
Config的設置:
package com.hsare.tools;
public class Config {
public static final long APPID = 1251169844;
public static final String SECRETID = "AKIDkNo6D8nSxIRPBloLOHzVs43pOlwvxS8d";
public static final String SECRETKEY = "TnvrbCbopfJkz0pTvDLK9nIbidP1Qjpb";
}
但是返回的結果是這個:response: Response{protocol=h2, code=405, message=, url=https://www.yanshishuo.com/wp-content/uploads/2017/09/gao.jpg}
我哪里弄錯了?有老鐵幫下忙嗎?
自己搗鼓出來了...
簽名部分:
主要是騰訊那邊給出的拼接是:
String.format("a=%d&b=%s&k=%s&t=%d&e=%d&r=%d", appId, bucketName,
secretId, now, now + expired, rdm);
其中a=%d
把它改成a=%s就可以了。。。
String.format("a=%s&k=%s&e=%d&t=%d&r=%d", appId, secretId, now + 2592000, now, rdm);
部分代碼:
//請求頭
String json = jsonObject.put("appid", Config.APPID)
.put("url", Config.image_url).toString();
//鑒權簽名
sign = Sign.appSign(Config.APPID, Config.SECRETID, Config.SECRETKEY);
Log.e(TAG, "Sign:" + sign);
RequestBody body = RequestBody.create(JSON, json);
//請求體
final Request request = new Request.Builder()
.header("Host", "recognition.image.myqcloud.com")
.header("Content-Type", "application/json")
.header("Authorization", sign)
.post(body)
.url(Config.code_url)
.build();
北大青鳥APTECH成立于1999年。依托北京大學優(yōu)質雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達內教育集團成立于2002年,是一家由留學海歸創(chuàng)辦的高端職業(yè)教育培訓機構,是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學校辦產(chǎn)業(yè)為響應國家深化產(chǎn)教融合/校企合作的政策,積極推進“中國制造2025”,實現(xiàn)中華民族偉大復興的升級產(chǎn)業(yè)鏈。利用北京大學優(yōu)質教育資源及背
博為峰,中國職業(yè)人才培訓領域的先行者
曾工作于聯(lián)想擔任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責任公司從事總經(jīng)理職務負責iOS教學及管理工作。
浪潮集團項目經(jīng)理。精通Java與.NET 技術, 熟練的跨平臺面向對象開發(fā)經(jīng)驗,技術功底深厚。 授課風格 授課風格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術顧問,美國Dachieve 系統(tǒng)架構師,美國AngelEngineers Inc. 系統(tǒng)架構師。