베 이 징 동 플랫폼 프레임 워 크 개발 오픈 플랫폼(수요,서버 코드,SDK 코드 포함)
23686 단어 경 동프레임 워 크 개발오픈 플랫폼SDK
사용 자 는 열 린 플랫폼 의 협의 규범 에 따라 정확 한 URL 을 맞 춰 야 합 니 다.Https 를 통 해 열 린 플랫폼 에 요청 하면 필요 한 데 이 터 를 얻 을 수 있 습 니 다.주요 프로 세 스 는 인자 작성,서명 생 성,HTTPS 요청 조립,요청,응답 결과 얻 기,분석 결 과 를 포함한다.
1.1 호출 매개 변수
매개 변수 이름
매개 변수 유형
필전
매개 변수 설명
method
String
예.
API 인터페이스 이름
access_token
String
예.
OAuth 권한 수여 방식 을 사용 하 는 것 은 필수 매개 변수 입 니 다.
app_key
String
예.
응용 appkey
sign
String
예.
다음"5.서명 알고리즘"설명 참조
timestamp
String
예.
시간 스탬프,형식 은 yyy-MM-dd HH:mm:ss,예 를 들 어 2019-05-01 00:00:00.API 서버 에서 클 라 이언 트 요청 시간 오 차 를 10 분 으로 허용 합 니 다.
format
String
아니.
당분간 json 만 지원
v
String
예.
API 프로 토 콜 버 전,인터페이스 문서 버 전 참조
360buy_param_json
String
예.
응용 급 인 자 를 전체 대상 으로 json 형식 으로 연결 하여 전달 해 야 합 니 다.
응용 급 매개 변수(더 많은 API 응용 매개 변수 참조 인터페이스 문서)
1.2 서명 알고리즘
API 가 호출 과정 에서 악의 적 인 사람 에 의 해 임의로 변경 되 는 것 을 방지 하기 위해 API 를 호출 하 는 것 은 서명 매개 변수 가 들 어 와 야 하 며 오픈 플랫폼 서버 는 요청 매개 변수 에 따라 서명 을 검증 하여 요청 매개 변수 가 합 법 적 인지 판단 합 니 다.오픈 플랫폼 서명 규칙 과정 은 다음 과 같 습 니 다.
모든 요청 파 라미 터 를 가나다순 으로 배열 합 니 다.예 를 들 어 accesstoken,app_key,method,timestamp,v,360buy_param_json ,
360 buy 로 정렬param_json,access_token,app_key,method,timestamp,v
모든 매개 변수 이름과 매개 변수 값 을 연결 합 니 다.예 를 들 어 360 buyparam_jsonxxxaccess_tokenxxxapp_keyxxxmethodxxxxxxtimestampxxxxxxvx
appcret 를 문자열(이전 연결 문자열)의 양 끝 에 끼 웁 니 다.예 를 들 어 appcret+XXXX+appcret
MD5 를 사용 하여 암호 화하 고 대문자 로 변환 합 니 다.
2 서버 코드,자바 예시
서버 는 SpringBoot 프레임 워 크 를 기반 으로 작 성 됩 니 다.입 구 는 Controller 에 두 고 업무 논 리 는 Service 에 적 혀 있 습 니 다.안전성 과 편리 한 검사 문 제 를 고려 하여 입력 성 검사 와 방문 로 그 를 추가 합 니 다.
2.1 인터페이스 입구 코드
인 터 페 이 스 는 하나의 입구 만 있 습 니 다.즉,Controller 코드 는 다음 과 같 습 니 다.
@Controller
public class RouterController {
@Resource
private RouterService routerService;
@Resource
private OpenApiLogService openApiLogService;
/**
* API ,
*
* @param request
* @param zrsc_param_json
* @return
*/
@RequestMapping(value = "routerjson", method = RequestMethod.POST)
@ResponseBody
public String routerjson(HttpServletRequest request, String zrsc_param_json) {
if (zrsc_param_json==null||"".equals(zrsc_param_json)) {
return JsonUtils.objToJson(APIMessageVo.fail(APIErrorEnum.FAIL_PARA_LOSE.getCode(), APIErrorEnum
.FAIL_PARA_LOSE.getName()));
}
APIMessageVo aPIMessageVo=openApiLogService.secrityCheck(request);
if(aPIMessageVo.isSuccess()){//
aPIMessageVo=routerService.router(request, zrsc_param_json);
openApiLogService.insert(request,aPIMessageVo);
}
return JsonUtils.objToJson(aPIMessageVo);
}
}
2.2 비 즈 니스 논리 층업무 논리 층 은 간단하게 예 를 들 어 업무 에 따라 다르다.
public APIMessageVo router(HttpServletRequest request, String zrsc_param_json) {
String access_token = request.getParameter("access_token");
String app_key = request.getParameter("app_key");
String method = request.getParameter("method");
String sign = request.getParameter("sign");
APIMessageVo checkResult=this.routerParaCheck(request, zrsc_param_json,access_token,app_key,method,sign);
if(!checkResult.isSuccess()){//
return checkResult;
}
if (APPInterfaceNameEnum.API_ADDRESS_ADDRESS2PROVICECITY_GET.getName().equals(method)) {//
return this.address2provincecity(zrsc_param_json);
} else {//
return APIMessageVo.fail(APIErrorEnum.FAIL_NOT_FOUND_INTERFACE.getCode(), APIErrorEnum.FAIL_NOT_FOUND_INTERFACE.getName());
}
}
private APIMessageVo routerParaCheck(HttpServletRequest request, String zrsc_param_json, String access_token,
String app_key, String method, String sign){
//*************** ***************
if (StringUtils.isBlank(access_token) || StringUtils.isBlank(app_key) || StringUtils.isBlank(method) ||
StringUtils.isBlank(sign)) {
return APIMessageVo.fail(APIErrorEnum.FAIL_PARA_LOSE.getCode(), APIErrorEnum.FAIL_PARA_LOSE.getName());
}
if(!APP_KEY.equals(app_key)){
return APIMessageVo.fail(APIErrorEnum.FAIL_NOT_EXIST_APP_ID.getCode(), APIErrorEnum.FAIL_NOT_EXIST_APP_ID.getName());
}
//***************sign ***************
try {
// request
Map<String, String> sysParams = getSysParams(request, zrsc_param_json);
//SDK
String signNew = SDKSignUtils.sign(sysParams, APP_SECRET);
//
if (!sign.equals(signNew)) {
return APIMessageVo.fail(APIErrorEnum.FAIL_ERR_APP_SECRET.getCode(), APIErrorEnum.FAIL_ERR_APP_SECRET.getName());
}
} catch (Exception e) {
return APIMessageVo.fail(APIErrorEnum.FAIL_EXCEPTION.getCode(), APIErrorEnum.FAIL_EXCEPTION.getName());
}
return APIMessageVo.success();
}
2.3 기초 공구 류
APIErrorEnum
public enum APIErrorEnum {
FAIL_NOTAUTH(201," "),
FAIL_TOKEN_EXPIRE(202,"Token "),
FAIL_PARA_LOSE(203," "),
FAIL_NOT_REALAUTH(204," "),
FAIL_NOT_METHOD(205," "),
FAIL_PARA_ERR(206," , "),
FAIL_NOT_EXIST_ACCOUNT(207," "),
FAIL_NOT_FOUND_APPLY(208," "),
FAIL_NOT_PASS_APPROVAL_APPLY(209," "),
FAIL_NOT_EXIST_APP_ID(210,"APP_ID "),
FAIL_NOT_FOUND_INTERFACE(211," "),
FAIL_ERR_APP_SECRET(212,"appSecret "),
FAIL_CALL_FREQUENTLY(214," "),
FAIL_EXCEPTION(290," ");
private int code;
private String name;
APIErrorEnum(int code,String name) {
this.code = code;
this.name = name;
}
public int getCode() {
return code;
}
public String getName() {
return name;
}
public void setCode(int code) {
this.code = code;
}
public void setName(String name) {
this.name = name;
}
}
APIMessageVo
public class APIMessageVo {
public static final Integer SUCCESS = 100;//
private boolean success;//
private Integer code = SUCCESS;//
private String message = " ";// ,
private Object data="";//
public APIMessageVo() {
//default
}
public APIMessageVo(boolean success, Integer code) {
this(success, code, " ", null);
}
public APIMessageVo(boolean success, Integer code, String message) {
this(success, code, message, null);
}
public APIMessageVo(boolean success, String message, Object data) {
this.success = success;
this.message = message;
this.data = data;
}
public APIMessageVo(boolean success, Integer code, String message, Object data) {
this.success = success;
this.code = code;
this.message = message;
this.data = data;
}
public APIMessageVo(boolean success, Object data) {
this.success = success;
this.data = data;
}
public static APIMessageVo fail(Integer code) {
return new APIMessageVo(false, code);
}
public static APIMessageVo fail(Integer code,String message) {
return new APIMessageVo(false,code, message);
}
public static APIMessageVo fail(Integer code,String message, Object data) {
return new APIMessageVo(false,code, message, data);
}
public static APIMessageVo success() {
return new APIMessageVo(true, SUCCESS);
}
public static APIMessageVo success(String message) {
return new APIMessageVo(true, message);
}
public static APIMessageVo success(String message, Object data) {
return new APIMessageVo(true, SUCCESS, message, data);
}
public static APIMessageVo success(Object data) {
return new APIMessageVo(true, " ", data);
}
}
JsonUtils
public class JsonUtils {
// jackson
private static final ObjectMapper MAPPER = new ObjectMapper();
/**
* Json
*
* @param obj
* @return json
*/
public static String objToJson(Object obj) {
try {
return MAPPER.writeValueAsString(obj);
} catch (JsonProcessingException e) {
log.error("Json :{}", e);
}
return "Json ";
}
/**
* json
* @param jsonData json
* @param beanType
* @return
*/
public static <T> T jsonToPojo(String jsonData, Class<T> beanType) {
try {
T obj = MAPPER.readValue(jsonData, beanType);
return obj;
} catch (Exception e) {
log.error("Json :{}", e);
}
return null;
}
}
3.SDK 코드,Java 예시
DefaultZrscClient
public class DefaultZrscClient implements ZrscClient {
private String serverUrl;
private String accessToken;
private int connectTimeout;
private int readTimeout;
private String appKey;
private String fuzz;
private String appSecret;
public DefaultZrscClient(String serverUrl, String accessToken, String appKey, String appSecret) {
this.connectTimeout = 8000;
this.readTimeout = 8000;
this.serverUrl = serverUrl;
this.accessToken = accessToken;
this.appKey = appKey;
this.appSecret = appSecret;
}
public <T extends AbstractResponse> T execute(ZrscRequest<T> request) throws ZrscException {
try {
String url = this.buildUrl(request);
Map<String, String> params = new HashMap();
String json = request.getAppJsonParams();
params.put("zrsc_param_json", json);
if (request.getOtherParams() != null) {
params.put("other", request.getOtherParams());
}
String rsp = HttpUtil.doPost(url, params, this.connectTimeout, this.readTimeout,this.accessToken);
T resp = this.parse(rsp, request.getResponseClass());
StringBuffer sb = new StringBuffer();
sb.append(url).append("&").append("zrsc_param_json").append("=").append(json);
resp.setUrl(sb.toString());
return resp;
} catch (Exception var8) {
var8.printStackTrace();
throw new ZrscException(" , ");
}
}
private <T extends AbstractResponse> String buildUrl(ZrscRequest<T> request) throws Exception {
Map<String, String> sysParams = request.getSysParams();
Map<String, String> pmap = new TreeMap();
pmap.put("zrsc_param_json", request.getAppJsonParams());
sysParams.put("method", request.getApiMethod());
sysParams.put("access_token", this.accessToken);
sysParams.put("app_key", this.appKey);
pmap.putAll(sysParams);
String sign = this.sign(pmap, this.appSecret);
sysParams.put("sign", sign);
StringBuilder sb = new StringBuilder(this.serverUrl);
sb.append("?");
sb.append(HttpUtil.buildQuery(sysParams, "UTF-8"));
return sb.toString();
}
private <T extends AbstractResponse> T parse(String rsp, Class<T> responseClass) throws ZrscException {
Parser parser;
if (this.serverUrl.endsWith("json")) {
parser = ParserFactory.getJsonParser();
} else {
parser = ParserFactory.getXmlParser();
}
return parser.parse(rsp, responseClass);
}
private String sign(Map<String, String> pmap, String appSecret) throws Exception {
StringBuilder sb = new StringBuilder(appSecret);
Iterator i$ = pmap.entrySet().iterator();
while(i$.hasNext()) {
Map.Entry<String, String> entry = (Map.Entry)i$.next();
String name = (String)entry.getKey();
String value = (String)entry.getValue();
if (StringUtil.areNotEmpty(new String[]{name, value})) {
sb.append(name).append(value);
}
}
sb.append(appSecret);
String result = CodecUtil.md5(sb.toString());
return result;
}
}
HttpUtil
public class HttpUtil {
public static final String DEFAULT_CHARSET = "UTF-8";
private static final String METHOD_POST = "POST";
private HttpUtil() {
throw new UnsupportedOperationException();
}
public static String buildQuery(Map<String, String> params, String charset) throws Exception {
if (params != null && !params.isEmpty()) {
StringBuilder query = new StringBuilder();
Set<Entry<String, String>> entries = params.entrySet();
boolean hasParam = false;
Iterator i$ = entries.iterator();
while(i$.hasNext()) {
Entry<String, String> entry = (Entry)i$.next();
String name = (String)entry.getKey();
String value = (String)entry.getValue();
if (StringUtil.areNotEmpty(new String[]{name, value})) {
if (hasParam) {
query.append("&");
} else {
hasParam = true;
}
query.append(name).append("=").append(URLEncoder.encode(value, charset));
}
}
return query.toString();
} else {
return null;
}
}
public static String doPost(String url, Map<String, String> params, int connectTimeout, int readTimeout,String token) throws Exception {
return doPost(url, params, "UTF-8", connectTimeout, readTimeout,token);
}
public static String doPost(String url, Map<String, String> params, String charset, int connectTimeout, int readTimeout,String token) throws Exception {
String ctype = "application/x-www-form-urlencoded;charset=" + charset;
//String ctype = "application/json;charset=" + charset;
String query = buildQuery(params, charset);
byte[] content = new byte[0];
if (query != null) {
content = query.getBytes(charset);
}
return doPost(url, ctype, content, connectTimeout, readTimeout,token);
}
public static String doPost(String url, String ctype, byte[] content, int connectTimeout, int readTimeout,String token) throws IOException {
HttpURLConnection conn = null;
OutputStream out = null;
String rsp = null;
try {
conn = getConnection(new URL(url), "POST", ctype,token);
conn.setConnectTimeout(connectTimeout);
conn.setReadTimeout(readTimeout);
out = conn.getOutputStream();
out.write(content);
rsp = getResponseAsString(conn);
} finally {
if (out != null) {
out.close();
}
if (conn != null) {
conn.disconnect();
}
}
return rsp;
}
private static HttpURLConnection getConnection(URL url, String method, String ctype,String token) throws IOException {
HttpURLConnection conn = null;
if ("https".equals(url.getProtocol())) {
SSLContext ctx = null;
try {
ctx = SSLContext.getInstance("TLS");
ctx.init(new KeyManager[0], new DefaultTrustManager[]{new DefaultTrustManager()}, new SecureRandom());
} catch (Exception var6) {
throw new IOException(var6);
}
HttpsURLConnection connHttps = (HttpsURLConnection)url.openConnection();
connHttps.setSSLSocketFactory(ctx.getSocketFactory());
connHttps.setHostnameVerifier(new HostnameVerifier() {
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
conn = connHttps;
} else {
conn = (HttpURLConnection)url.openConnection();
}
((HttpURLConnection)conn).setRequestMethod(method);
((HttpURLConnection)conn).setDoInput(true);
((HttpURLConnection)conn).setDoOutput(true);
((HttpURLConnection)conn).setRequestProperty("Accept", "text/xml,text/javascript,text/html");
((HttpURLConnection)conn).setRequestProperty("User-Agent", "kcb-sdk-java");
((HttpURLConnection)conn).setRequestProperty("Content-Type", ctype);
((HttpURLConnection)conn).setRequestProperty("Authorization", token);
return (HttpURLConnection)conn;
}
protected static String getResponseAsString(HttpURLConnection conn) throws IOException {
String charset = getResponseCharset(conn.getContentType());
InputStream es = conn.getErrorStream();
if (es == null) {
return getStreamAsString(conn.getInputStream(), charset);
} else {
String msg = getStreamAsString(es, charset);
if (StringUtil.isEmpty(msg)) {
throw new IOException(conn.getResponseCode() + ":" + conn.getResponseMessage());
} else {
throw new IOException(msg);
}
}
}
private static String getStreamAsString(InputStream stream, String charset) throws IOException {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(stream, charset));
StringWriter writer = new StringWriter();
char[] chars = new char[256];
boolean var5 = false;
int count;
while((count = reader.read(chars)) > 0) {
writer.write(chars, 0, count);
}
String var6 = writer.toString();
return var6;
} finally {
if (stream != null) {
stream.close();
}
}
}
private static String getResponseCharset(String ctype) {
String charset = "UTF-8";
if (!StringUtil.isEmpty(ctype)) {
String[] params = ctype.split(";");
String[] arr$ = params;
int len$ = params.length;
for(int i$ = 0; i$ < len$; ++i$) {
String param = arr$[i$];
param = param.trim();
if (param.startsWith("charset")) {
String[] pair = param.split("=", 2);
if (pair.length == 2 && !StringUtil.isEmpty(pair[1])) {
charset = pair[1].trim();
}
break;
}
}
}
return charset;
}
private static byte[] getTextEntry(String fieldName, String fieldValue, String charset) throws IOException {
StringBuilder entry = new StringBuilder();
entry.append("Content-Disposition:form-data;name=\"");
entry.append(fieldName);
entry.append("\"\r
Content-Type:text/plain\r
\r
");
entry.append(fieldValue);
return entry.toString().getBytes(charset);
}
private static byte[] getFileEntry(String fieldName, String fileName, String mimeType, String charset) throws IOException {
StringBuilder entry = new StringBuilder();
entry.append("Content-Disposition:form-data;name=\"");
entry.append(fieldName);
entry.append("\";filename=\"");
entry.append(fileName);
entry.append("\"\r
Content-Type:");
entry.append(mimeType);
entry.append("\r
\r
");
return entry.toString().getBytes(charset);
}
}
4.통합 SDK,코드 예시
@Test
void getAddress() throws IOException {
Address2provicecityRequest request=new Address2provicecityRequest();
request.setAddress(" ");
ZrscClient client = new DefaultZrscClient(serverUrl, accessToken, appKey,
appSecret);
try {
Address2provicecityResponse response= client.execute(request);
System.out.println("data="+JsonUtil.toJson(response.getData()));
} catch (Exception e) {
e.printStackTrace();
}
}
실행 결과:data={"source":"아교 거리 동 수로 북","province":"산동성","city":"요성 시","area":"동아 현","street":"신도 시 거리","addressInfo":"아교 거리 동 수로 북"}
5.총화
경 동 오픈 플랫폼 의 전 삼 과 서명 알고리즘 이 대표 적 입 니 다.이 블 로 그 는 오픈 플랫폼 개방 의 주요 구성 부분 만 공유 할 뿐 다른 내용 에 관심 을 가 져 주 셨 으 면 좋 겠 습 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
베 이 징 동 플랫폼 프레임 워 크 개발 오픈 플랫폼(수요,서버 코드,SDK 코드 포함)사용 자 는 열 린 플랫폼 의 협의 규범 에 따라 정확 한 URL 을 맞 춰 야 합 니 다.Https 를 통 해 열 린 플랫폼 에 요청 하면 필요 한 데 이 터 를 얻 을 수 있 습 니 다.주요 프로 세 스 는 인자...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.