本帖最後由 3ldk 於 2017-8-23 20:05 編輯
任何方法都得, 可以係用某個tools, 某種技術, 某種技巧, 甚至用某種標準流程都可以
下面直接用code講出而家寫api會有咩問題
一個好簡單既例子, 睇落好似跟足standard, 好標準既寫法, 但其實當中有不少問題, 請留意comment
Server:- // 問題1: API條path, 當API越黎越多, 越黎越長, 或者越黎越複雜, 要開一個新API, 又唔知有無同之前撞,
- // 特別係如果用framework, d framework好中意將所有route同全個program寫晒係同一個index.php入面, 要查返之前寫落的API特別困難
- // 就算假設有好好既documentation, 將所有api寫晒落一個excel入面, 一行一個, 當api去到幾百個甚至過千, 一樣好難睇
- // 而且只要多過一個copy(excel一個, index.php一個), 就好容易出現唔同步, 花功夫去maintain依樣野, 又係一個成本
- Route::get('product', function () { //get product list
- $products=array();
- for($i=1; $i<10; $++){
- //問題2: 用黎交換data的class, client side已經整左一個, 但server又要再寫一次, 容易出現不一致, 例如依度的productName, 就同client的name不同了, 一但出現依個問題, 又要花時間debug
- //唔只咁, 係server係要每個route都寫一次個class, 就係下面條route, 正正係一個例子, 依度寫左係productName, 但下面就叫pName, 咁又要debug一餐
- $product=new stdClass();
- $product->id=$i;
- $product->productName='name'.$i;
- array_push($products, $product);
- }
- return json_encode($products);
- });
- Route::post('product', function () { //all a product
- $product=new stdClass();
- $product->pid=10;
- $product->pName='name10';
- //... save prodcut to DB
- return json_encode($product);
- });
- Route::patch('product/{id}', function ($id) { //update a product
- //...
- });
- Route::delete('product/{id}', function ($id) { //delete a product
- //...
- });
複製代碼 Client:- public class Product {
- public int id;
- public String name;
- }
- //問題3: route既問題同server類似, 但更嚴重, server都仲話一個index.php寫晒所有route, 但client side因為係call既一方, call既route分散晒係不同的class, 仲難管理
- //不過, 當然最大問題都係在於, server定義左一次, client又定義一次, 極容易出現不一致, 雖然依種bug係容易發現, 但亦同時經常出現, 特別係route一多
- //正是因為出現得太多, 加加埋埋都花唔少時間
- StringRequest stringRequest = new StringRequest(Request.Method.GET, "xxxxx/product",
- new Response.Listener<String>() {
- @Override
- public void onResponse(String response) {
- Gson gson=new Gson();
- Product[] p=gson.fromJson(response,Product.class);
- }
- },
- new Response.ErrorListener() {
- @Override
- public void onErrorResponse(VolleyError error) {
- Log.v("VolleyError", error.getMessage());
- }
- });
- StringRequest stringRequest = new StringRequest(Request.Method.POST, "xxxxx/product", //省略
- StringRequest stringRequest = new StringRequest(Request.Method.PATCH, "xxxxx/product", //省略
- StringRequest stringRequest = new StringRequest(Request.Method.DELETE, "xxxxx/product", //省略
複製代碼 問題講住咁多, 我諗暫時最低級, 最不用技術既解決方法, 就係盡量做好d documentation
但咁未必係好好既解決方法, 因為做多份document出黎, 即係多份copy, 亦即係更容易出錯, 而且多過一份copy, 正是上面例子的重點問題 |