JAVA_PHP_Koala HW模擬程式 [JAVA 和 PHP 實現 restful api 通訊]
JAVA_PHP_Koala HW模擬程式 [JAVA 和 PHP 實現 restful api 通訊]
參考資料:http://techsupport.megvii.com/hc/kb/article/178244/
GITHUB: https://github.com/jash-git/JAVA_PHP_Koala-restful-api
目標:按照參考資料撰寫對應的『JAVA Client』 和對應的 『模擬用PHP SERVER』
PHP[authLogin API 模擬]~koala_authLogin.php
01.抓取/紀錄(寫入檔案)所以Client的所有Header資訊
02.抓取/紀錄(寫入檔案)Client傳送過來的JSON資料
03.撰寫輸出對應JSON資訊,達到Client可以判斷並認為登入成功
<?php function GetAllHeader() { // 忽略获取的header数据。这个函数后面会用到。主要是起过滤作用 $ignore = array('host','accept','content-length','content-type'); $headers = array(); //这里大家有兴趣的话,可以打印一下。会出来很多的header头信息。咱们想要的部分,都是‘http_'开头的。所以下面会进行过滤输出。 /*var_dump($_SERVER); exit;*/ foreach($_SERVER as $key=>$value){ if(substr($key, 0, 5)==='HTTP_'){ //这里取到的都是'http_'开头的数据。 //前去开头的前5位 $key = substr($key, 5); //把$key中的'_'下划线都替换为空字符串 $key = str_replace('_', ' ', $key); //再把$key中的空字符串替换成‘-’ $key = str_replace(' ', '-', $key); //把$key中的所有字符转换为小写 $key = strtolower($key); //这里主要是过滤上面写的$ignore数组中的数据 if(!in_array($key, $ignore)){ $headers[$key] = $value; } } } //输出获取到的header return $headers; } //header('Content-Type: application/json; charset=UTF-8'); //設定資料類型為 json,編碼 utf-8 set_time_limit(0);//確保不會超時 date_default_timezone_set("Asia/Taipei"); $filename="client_header_".date('Y-m-d-H-i-s').".txt"; $myfile = fopen($filename, "w") or die("Unable to open file!"); foreach (getallheaders() as $name => $value) { fwrite($myfile, "$name: $value\n"); } fwrite($myfile, "\n=========================\n\n"); foreach (GetAllHeader() as $name => $value) { fwrite($myfile, "$name: $value\n"); } fwrite($myfile, "\n=========================\n\n"); foreach($_SERVER as $key=>$value){ fwrite($myfile, "$key: $value\n"); } fwrite($myfile, "\n=========================\n\n"); $data = file_get_contents("php://input");//接收client set json data fwrite($myfile, "client set json data: $data\n"); fwrite($myfile, "\n=========================\n\n"); $Subarraydata=array(); $Subarraydata["id"]=200; $arraydata=array(); $arraydata["code"]=0; $arraydata["data"]=$Subarraydata; echo json_encode($arraydata); fclose($myfile); ?>
JAVA[呼叫 authLogin API]
01.按照參考資料建立 authLogin 函數
package test01; import org.apache.http.client.CookieStore; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.protocol.HttpClientContext; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; import org.json.JSONObject; public class test01 { public static CookieStore authLogin(String url,String username,String password) throws Exception { /** * http://techsupport.megvii.com/hc/kb/article/178244/ * 登录 获取 Cookie * @param url API地址 * @param username 账号, 注意不要使用admin@megvii.com * @param password 密码 * @return cookie CookieStore * @throws Exception */ System.out.println("Start /auth/login to ..."); CloseableHttpClient httpclient = HttpClients.createDefault(); HttpPost request = new HttpPost(url); //设置user-agent为 "Koala Admin" //设置Content-Type为 "application/json" request.setHeader("User-Agent", "Koala Admin"); request.setHeader("Content-Type", "application/json"); JSONObject json = new JSONObject(); json.put("username", username); json.put("password", password); request.setEntity(new StringEntity(json.toString(), "UTF-8")); //发起网络请求,获取结果值 HttpClientContext context = HttpClientContext.create(); System.out.println("Send data:"+json.toString()); CloseableHttpResponse response = httpclient.execute(request, context); String responseBody = EntityUtils.toString(response.getEntity(), "UTF-8"); //--- //A JSONObject text must begin with '{' at 1 [character 2 line 1] //https://blog.csdn.net/u012860950/article/details/77884515 int i = responseBody.indexOf("{"); responseBody = responseBody.substring(i); //---A JSONObject text must begin with '{' at 1 [character 2 line 1] System.out.println("Get data:"+responseBody); //解析JSON数据 JSONObject resp = new JSONObject(responseBody); int result = resp.optInt("code", -1); if (result != 0) { System.err.println("Login failed, code:" + result); }else{ System.out.println("Login Success,id:" + resp.getJSONObject("data").getInt("id")); return context.getCookieStore(); } return null; } public static void main(String[] args) { // TODO Auto-generated method stub System.out.print("Hello World!\n"); try { authLogin("http://127.0.0.1/Koala_authLogin.php","jashliao","123456789"); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
4 thoughts on “JAVA_PHP_Koala HW模擬程式 [JAVA 和 PHP 實現 restful api 通訊]”
JAVA 和 PHP 實現 WEB API RESTFUL API 通訊
註記[實測與機器連線: URL和接收到的JSON]
authLogin(“http://192.168.1.237/auth/login”,”test@admin.com”,”123456″);
Hello World!
Start /auth/login to …
Send data:{“password”:”123456″,”username”:”test@admin.com”}
Get data:{
“code”: 0,
“data”: {
“avatar”: “”,
“company”: {
“attendance_on”: true,
“attendance_weekdays”: [
1,
2,
3,
4,
5
],
“consigner”: “\u66f2”,
“create_time”: 1558543636,
“data_version”: 1,
“deployment”: 1,
“door_range”: [
[
0,
0
],
[
24,
0
]
],
“door_weekdays”: [
1,
2,
3,
4,
5,
6,
7
],
“feature_version”: 7,
“fmp_on”: false,
“full_day”: true,
“id”: 1,
“logo”: “/static/images/logo.png”,
“name”: “\u5ba2\u6237”,
“notdetermined_on”: true,
“remark”: “”,
“scenario”: “\u6b63\u5e38\u4f7f\u7528”,
“upload”: true,
“yellowlist_warn”: true
},
“company_id”: 1,
“id”: 2,
“organization_id”: null,
“password_reseted”: true,
“permission”: [],
“role_id”: 2,
“username”: “test@admin.com”,
“verify”: false
},
“page”: {}
}
收到的實際JSON 轉 C# Class
public class Company
{
public bool attendance_on { get; set; }
public List attendance_weekdays { get; set; }
public string consigner { get; set; }
public int create_time { get; set; }
public int data_version { get; set; }
public int deployment { get; set; }
public List<List> door_range { get; set; }
public List door_weekdays { get; set; }
public int feature_version { get; set; }
public bool fmp_on { get; set; }
public bool full_day { get; set; }
public int id { get; set; }
public string logo { get; set; }
public string name { get; set; }
public bool notdetermined_on { get; set; }
public string remark { get; set; }
public string scenario { get; set; }
public bool upload { get; set; }
public bool yellowlist_warn { get; set; }
}
public class Data
{
public string avatar { get; set; }
public Company company { get; set; }
public int company_id { get; set; }
public int id { get; set; }
public object organization_id { get; set; }
public bool password_reseted { get; set; }
public List permission { get; set; }
public int role_id { get; set; }
public string username { get; set; }
public bool verify { get; set; }
}
public class Page
{
}
public class RootObject
{
public int code { get; set; }
public Data data { get; set; }
public Page page { get; set; }
}
使用C# 用 JAVA 為參照 實際測試真實API 可以得到下面結果
C# 原始碼 以更新到 GITHUB上
{“code”:0,”data”:{“avatar”:””,”company”:{“attendance_on”:true,”attendance_weekdays”:[1,2,3,4,5],”consigner”:”\u66f2″,”create_time”:1558543636,”data_version”:1,”deployment”:1,”door_range”:[[0,0],[24,0]],”door_weekdays”:[1,2,3,4,5,6,7],”feature_version”:7,”fmp_on”:false,”full_day”:true,”id”:1,”logo”:”/static/images/logo.png”,”name”:”\u5ba2\u6237″,”notdetermined_on”:true,”remark”:””,”scenario”:”\u6b63\u5e38\u4f7f\u7528″,”upload”:true,”yellowlist_warn”:true},”company_id”:1,”id”:2,”organization_id”:null,”password_reseted”:true,”permission”:[],”role_id”:2,”username”:”test@admin.com”,”verify”:false},”page”:{}}