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

J2ME HTTP POST 完整實作範例與常見錯誤避坑指南

     編輯:J2ME

核心程式碼:標準 POST 請求流程

在 J2ME 中發送 HTTP POST 請求,關鍵在於正確設定請求標頭與資料寫入順序。以下是最精簡且完整的範本:

HttpConnection conn = null;
OutputStream out = null;
try {
    // 1. 建立連線
    conn = (HttpConnection) Connector.open(url);

    // 2. 設定請求方法與標頭 (順序很重要)
    conn.setRequestMethod(HttpConnection.POST);
    conn.setRequestProperty("User-Agent", "Profile/MIDP-1.0 Configuration/CLDC-1.0");
    conn.setRequestProperty("Content-Language", "en-US");
    conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
    conn.setRequestProperty("Accept", "application/octet-stream");
    conn.setRequestProperty("Connection", "close"); // 避免 Keep-Alive 造成部分閘道器逾時

    // 3. 準備資料並寫入 Content-Length
    byte[] postData = requestString.getBytes("UTF-8"); // 建議明確指定編碼
    conn.setRequestProperty("Content-Length", String.valueOf(postData.length));

    // 4. 開啟輸出串流並送出資料
    out = conn.openOutputStream();
    out.write(postData);
    out.flush();

    // 5. 讀取回應碼與內容
    int rc = conn.getResponseCode();
    if (rc == HttpConnection.HTTP_OK) {
        InputStream in = conn.openInputStream();
        // 處理回應資料...
        in.close();
    }
} catch (IOException e) {
    // 網路錯誤處理
} finally {
    if (out != null) try { out.close(); } catch (IOException ignored) {}
    if (conn != null) try { conn.close(); } catch (IOException ignored) {}
}

開發者最易忽略的兩個標頭

標頭用途缺失後果
Content-Type告知伺服器請求主體格式 (如 application/x-www-form-urlencoded)伺服器無法解析參數,導致 request.getParameter() 全為 null
Content-Length宣告主體位元組長度部分 Servlet 容器會拒絕無長度的 POST,回傳 411 Length Required

切記:setRequestProperty("Content-Length", ...) 必須在 openOutputStream() 之前 呼叫,否則會拋出 IllegalStateException。

常見陷阱與最佳實務

  • 編碼一致性:客戶端 getBytes("UTF-8")、伺服器端 request.setCharacterEncoding("UTF-8") 必須一致,避免中文亂碼。
  • 非同步執行:網路操作 不可 在事件派發執行緒 (UI 執行緒) 執行,務必另開 Thread 或使用 TimerTask,否則裝置會凍結。
  • 逾時控制:MIDP 無內建逾時 API,建議自行實作倒數計時執行緒,超時時呼叫 conn.close() 強制中斷。
  • 重導向處理:HttpConnection 不會自動跟隨 301/302,需手動讀取 Location 標頭再發新請求。
  • 資料大小限制:早期裝置 heap 極小 (如 200 KB),避免在記憶體中一次組裝超大字串,改用分塊寫入或串流處理。

進階:Multipart/Form-Data 檔案上傳

若需上傳二進位檔案,需組裝 multipart/form-data 主體,範例結構:

--boundary_12345
Content-Disposition: form-data; name="file"; filename="photo.jpg"
Content-Type: image/jpeg

[二進位資料]
--boundary_12345--

此時 Content-Type 應設為 multipart/form-data; boundary=boundary_12345,並逐段寫入 OutputStream。

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