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

J2ME 呼叫 .NET Web Service (kXML 解析 SOAP 回應)

     編輯:J2ME

架構概覽

MIDlet 使用 HttpConnection 以 HTTP GET 方式呼叫 ASP.NET Web Service (ASMX),取得 XML 回應,再用輕量級 kXML 解析提取所需字串。

呼叫端核心代碼

private void connect() {
    try {
        String url = "https://localhost/RoadWebService/RoadWS.asmx/WebServiceTest?param=" +
                     inputTextField.getString();
        HttpConnection hc = (HttpConnection) Connector.open(url);
        DataInputStream in = new DataInputStream(hc.openInputStream());

        StringBuilder sb = new StringBuilder();
        int ch;
        while ((ch = in.read()) != -1) sb.append((char) ch);
        String xml = sb.toString();

        in.close(); hc.close();

        // 解析 XML 並顯示
        String[] items = parseUsingKXml(xml);
        display.setCurrent(new ItemList(items));
    } catch (IOException e) {
        messageItem.setText(e.toString());
    }
}

kXML 解析實作

private String[] parseUsingKXml(String xml) {
    try {
        ByteArrayInputStream bin = new ByteArrayInputStream(xml.getBytes());
        InputStreamReader isr = new InputStreamReader(bin);
        XmlParser parser = new XmlParser(isr);
        Vector items = new Vector();
        parseItems(parser, items);
        String[] arr = new String[items.size()];
        items.copyInto(arr);
        return arr;
    } catch (IOException e) {
        return new String[] { e.toString() };
    }
}

private void parseItems(XmlParser parser, Vector items) throws IOException {
    boolean inString = false;
    while (true) {
        ParseEvent event = parser.read();
        switch (event.getType()) {
            case Xml.START_TAG:
                if ("string".equals(event.getName())) inString = true;
                break;
            case Xml.END_TAG:
                if ("string".equals(event.getName())) inString = false;
                break;
            case Xml.TEXT:
                if (inString) items.addElement(event.getText());
                break;
            case Xml.END_DOCUMENT:
                return;
        }
    }
}

.NET Web Service 範例 (C#)

[WebMethod]
public string WebServiceTest(string param) {
    if ("cqy".equals(param)) return "hello cqy";
    if ("zl".equals(param)) return "hello zl";
    if ("zy".equals(param)) return "hello zy";
    return "who are you";
}

回應 XML 結構:

<?xml version="1.0" encoding="utf-8"?>
<string xmlns="https://tempuri.org/">hello zl</string>

完整 MIDlet 類別

public class HttpMidlet extends MIDlet implements CommandListener {
    private Display display;
    private Form mainForm;
    private StringItem messageItem;
    private Command exitCmd, connectCmd;
    private TextField inputTextField;

    public HttpMidlet() {
        mainForm = new Form("HttpMidlet");
        messageItem = new StringItem(null, "");
        exitCmd = new Command("退出", Command.EXIT, 0);
        connectCmd = new Command("連接", Command.SCREEN, 0);
        inputTextField = new TextField("Input text", "", 128, TextField.ANY);
        mainForm.append(messageItem);
        mainForm.append(inputTextField);
        mainForm.addCommand(exitCmd);
        mainForm.addCommand(connectCmd);
        mainForm.setCommandListener(this);
    }

    public void startApp() {
        display = Display.getDisplay(this);
        display.setCurrent(mainForm);
    }

    public void commandAction(Command c, Displayable d) {
        if (c == exitCmd) { notifyDestroyed(); }
        else if (c == connectCmd) {
            Form wait = new Form("Waiting...");
            display.setCurrent(wait);
            new Thread() { public void run() { connect(); } }.start();
        }
    }
    // connect(), parseUsingKXml(), parseItems(), ItemList 內部類別...
}

部署步驟

  1. WTK 2.0 建立專案 HttpMidlet,主類別同名。
  2. 將 HttpMidlet.java 放入 apps/HttpMidlet/src。
  3. 下載 ksoap-midp.zip (含 kXML),解壓至 apps/HttpMidlet/lib。
  4. Build 執行。

注意事項

  • 生產環境建議改用 HTTP POST + SOAP 訊息本文,並處理命名空間。
  • kXML 極輕量,適合 CLDC 環境;若需完整 SOAP 支援可考慮 kSOAP。
  • 網路操作必須在獨立執行緒執行,避免阻塞 UI。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved