首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Android 客戶端透過 Web Service 取得 MySQL 單筆/多筆資料:JSON + HttpURLConnection 完整範例

     編輯:程式設計疑難解答

架構:Android (Client) → Tomcat (Servlet/REST) → MySQL。資料傳輸格式統一用 **JSON**,無論單筆或多筆皆適用。

伺服端 Servlet (單筆查詢)

@WebServlet("/api/user/*")
public class UserServlet extends HttpServlet {
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        String id = req.getPathInfo().substring(1); // /api/user/123 → 123
        try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
             PreparedStatement ps = conn.prepareStatement("SELECT * FROM users WHERE id=?")) {
            ps.setString(1, id);
            ResultSet rs = ps.executeQuery();
            resp.setContentType("application/json;charset=UTF-8");
            if (rs.next()) {
                JSONObject json = new JSONObject();
                json.put("id", rs.getInt("id"));
                json.put("name", rs.getString("name"));
                json.put("email", rs.getString("email"));
                resp.getWriter().write(json.toString());
            } else {
                resp.setStatus(404);
                resp.getWriter().write("{\"error\":\"Not found\"}");
            }
        } catch (SQLException e) {
            resp.setStatus(500);
            resp.getWriter().write("{\"error\":\"" + e.getMessage() + "\"}");
        }
    }
}

伺服端 Servlet (多筆查詢 - 分頁)

@WebServlet("/api/users")
public class UsersServlet extends HttpServlet {
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        int page = Integer.parseInt(req.getParameter("page"));
        int size = Integer.parseInt(req.getParameter("size"));
        try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
             PreparedStatement ps = conn.prepareStatement(
                 "SELECT * FROM users LIMIT ? OFFSET ?")) {
            ps.setInt(1, size);
            ps.setInt(2, (page-1)*size);
            ResultSet rs = ps.executeQuery();
            JSONArray arr = new JSONArray();
            while (rs.next()) {
                JSONObject o = new JSONObject();
                o.put("id", rs.getInt("id"));
                o.put("name", rs.getString("name"));
                arr.put(o);
            }
            resp.setContentType("application/json;charset=UTF-8");
            resp.getWriter().write(arr.toString());
        } catch (SQLException e) {
            resp.setStatus(500);
            resp.getWriter().write("{\"error\":\"" + e.getMessage() + "\"}");
        }
    }
}

Android 客戶端 (OkHttp + Gson 推薦)

// 單筆
Request req = new Request.Builder()
    .url("https://api.example.com/api/user/123")
    .build();
client.newCall(req).enqueue(new Callback() {
    @Override public void onResponse(Call call, Response res) {
        if (res.isSuccessful()) {
            User user = new Gson().fromJson(res.body().string(), User.class);
            runOnUiThread(() -> textView.setText(user.name));
        }
    }
    @Override public void onFailure(Call call, IOException e) { e.printStackTrace(); }
});

// 多筆
Request req2 = new Request.Builder()
    .url("https://api.example.com/api/users?page=1&size=20")
    .build();
// 解析 List 同理

關鍵點總結

  1. JSON 是資料格式,非框架:雙方約定欄位名稱即可,單筆用 `JSONObject`,多筆用 `JSONArray`。
  2. C/S vs B/S:Android + Tomcat 屬 **C/S 架構** (Client/Server),非 B/S。
  3. 連線池:伺服端必須用 `HikariCP`/`Druid` 管理資料庫連線,避免頻繁建立連線拖垮 Tomcat。
  4. 安全性:生產環境強制 HTTPS、JWT 驗證、參數化查詢防注入。

掌握「Servlet 回傳 JSON → Android OkHttp/Gson 解析」這套標準流程,單筆多筆通用,擴充性極佳。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved