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());
}
}
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;
}
}
}
[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>
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 內部類別...
}
HttpMidlet,主類別同名。HttpMidlet.java 放入 apps/HttpMidlet/src。ksoap-midp.zip (含 kXML),解壓至 apps/HttpMidlet/lib。