这是一个返回 XML 或 JSON 的 Web 服务。
对于 XML:
- 您可以使用SoapUI 来测试和检查Web 服务。
- 您可以使用 ksoap2-android 或 IceSoap 等库将 SOAP 消息发送到 Web 服务,但我们将使用
java.net.HttpURLConnection。
对于 JSON:
- 您可以使用Postman 来测试和检查Web 服务。
调用Web Service所需的步骤:
- 打开您的 AndroidManifest.xml 并添加互联网权限
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
- 编写调用 Web 服务上的 GetContestants 操作的代码。
- 编写代码来解析从 GetContestants 操作接收到的数据。
- 编写代码以使用调用和封装上述方法的 AsyncTask,这样就不会全部发生在主 UI 线程上。
对于 XML,示例代码(步骤 2)在 Web 服务上调用基于 SOAP 的 GetContestants 操作:
private String getContestants(String username, String password) throws Exception {
URL obj = new URL("http://www.fansplay.com/wsfpbtest/FBS.svc/SOAP");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("Content-type", "text/xml; charset=utf-8");
con.setRequestProperty("SOAPAction", "http://tempuri.org/IFBS/GetContestants");
String reqXML = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:tem=\"http://tempuri.org/\" xmlns:fbs=\"http://schemas.datacontract.org/2004/07/FBService\">\n" +
" <soapenv:Header/>\n" +
" <soapenv:Body>\n" +
" <tem:GetContestants>\n" +
" <tem:objContestant>\n" +
" <fbs:APIUserName>" + username + "</fbs:APIUserName>\n" +
" <fbs:Password>" + password +"</fbs:Password>\n" +
" </tem:objContestant>\n" +
" </tem:GetContestants>\n" +
" </soapenv:Body>\n" +
"</soapenv:Envelope>";
// Send post request
con.setDoOutput(true);
DataOutputStream wr = new DataOutputStream(con.getOutputStream());
wr.writeBytes(reqXML);
wr.flush();
wr.close();
// Read response
BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
return response.toString();
}
调用上述方法如下:String xml = getContestants("Rjfk@vDV43F", "79C8RE30-ELJD-4617-VX2D-A374C8C59E3F");
对于 JSON,在 Web 服务上调用 GetContestants 方法的示例代码(步骤 2):
private String getContestants(String username, String password) throws Exception {
URL obj = new URL("http://www.fansplay.com/wsfpbtestV3/FBS.svc/GetContestants");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("Content-type", "text/json");
String jsonBody = String.format("{\"APIUserName\": \"%s\" , \"Password\": \"%s\"}", username, password);
// Send post request
con.setDoOutput(true);
DataOutputStream wr = new DataOutputStream(con.getOutputStream());
wr.writeBytes(jsonBody);
wr.flush();
wr.close();
// Read response
BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
return response.toString();
}
调用上述方法如下:String json = getContestants("Rjfk@vDV43F", "79C8RE30-ELJD-4617-VX2D-A374C8C59E3F");
对于 XML,解析和提取参赛者数据的示例代码(步骤 3):
private void parseContestants(String xml) throws ParserConfigurationException, IOException, SAXException {
// Build a Document from the XML
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder db = factory.newDocumentBuilder();
InputSource inStream = new InputSource();
inStream.setCharacterStream(new StringReader(xml));
Document doc = db.parse(inStream);
NodeList nl = doc.getElementsByTagName("a:Contestant");
for(int i = 0; i < nl.getLength(); i++) {
Node node = nl.item(i);
if (node instanceof Element) {
Node contestant = (Element) node;
// Extract the contestant data
NodeList contestantProperties = contestant.getChildNodes();
if (contestantProperties.item(0).getFirstChild() != null) {
String age = contestantProperties.item(0).getFirstChild().getNodeValue();
}
if (contestantProperties.item(1).getFirstChild() != null) {
String bio = contestantProperties.item(1).getFirstChild().getNodeValue();
}
if (contestantProperties.item(2).getFirstChild() != null) {
String city = contestantProperties.item(2).getFirstChild().getNodeValue();
}
//ToDO: Extract the other properties of Contestant following pattern above
}
}
}
调用上述方法如下:parseContestants(xml);
对于 JSON,解析和提取参赛者数据的示例代码(第 3 步):
我们将使用 GSON,它是一个 Java 库,可用于将 JSON 字符串转换为等效的 Java 对象。
通过将以下行添加到您的 build.gradle 文件中,将 GSON 添加到您的项目中:compile 'com.google.code.gson:gson:2.4'
将以下Contestant 类添加到您的项目中:
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
public class Contestant {
@SerializedName("Age")
@Expose
private Integer Age;
@SerializedName("Bio")
@Expose
private String Bio;
@SerializedName("City")
@Expose
private String City;
@SerializedName("ContestantID")
@Expose
private Integer ContestantID;
@SerializedName("CurrentWeekPoints")
@Expose
private Integer CurrentWeekPoints;
@SerializedName("FirstName")
@Expose
private String FirstName;
@SerializedName("ImageURL")
@Expose
private String ImageURL;
@SerializedName("LastName")
@Expose
private String LastName;
@SerializedName("Occupation")
@Expose
private String Occupation;
@SerializedName("State")
@Expose
private String State;
@SerializedName("Status")
@Expose
private String Status;
@SerializedName("TotalPoints")
@Expose
private Integer TotalPoints;
public Integer getAge() {
return Age;
}
public void setAge(Integer Age) {
this.Age = Age;
}
public String getBio() {
return Bio;
}
public void setBio(String Bio) {
this.Bio = Bio;
}
public String getCity() {
return City;
}
public void setCity(String City) {
this.City = City;
}
public Integer getContestantID() {
return ContestantID;
}
public void setContestantID(Integer ContestantID) {
this.ContestantID = ContestantID;
}
public Integer getCurrentWeekPoints() {
return CurrentWeekPoints;
}
public void setCurrentWeekPoints(Integer CurrentWeekPoints) {
this.CurrentWeekPoints = CurrentWeekPoints;
}
public String getFirstName() {
return FirstName;
}
public void setFirstName(String FirstName) {
this.FirstName = FirstName;
}
public String getImageURL() {
return ImageURL;
}
public void setImageURL(String ImageURL) {
this.ImageURL = ImageURL;
}
public String getLastName() {
return LastName;
}
public void setLastName(String LastName) {
this.LastName = LastName;
}
public String getOccupation() {
return Occupation;
}
public void setOccupation(String Occupation) {
this.Occupation = Occupation;
}
public String getState() {
return State;
}
public void setState(String State) {
this.State = State;
}
public String getStatus() {
return Status;
}
public void setStatus(String Status) {
this.Status = Status;
}
public Integer getTotalPoints() {
return TotalPoints;
}
public void setTotalPoints(Integer TotalPoints) {
this.TotalPoints = TotalPoints;
}
}
将以下Contestants 类添加到您的项目中:
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
import java.util.ArrayList;
import java.util.List;
public class Contestants {
@SerializedName("Contestants")
@Expose
private List<Contestant> Contestants = new ArrayList<Contestant>();
@SerializedName("ResponseCode")
@Expose
private Boolean ResponseCode;
@SerializedName("ResponseMessage")
@Expose
private String ResponseMessage;
public List<Contestant> getContestants() {
return Contestants;
}
public void setContestants(List<Contestant> Contestants) {
this.Contestants = Contestants;
}
public Boolean getResponseCode() {
return ResponseCode;
}
public void setResponseCode(Boolean ResponseCode) {
this.ResponseCode = ResponseCode;
}
public String getResponseMessage() {
return ResponseMessage;
}
public void setResponseMessage(String ResponseMessage) {
this.ResponseMessage = ResponseMessage;
}
}
以上类由jsonschema2pojo生成
将 JSON 解析为等效的 Java 对象:
private Contestants parseContestants(String json) {
return new Gson().fromJson(json, Contestants.class);
}
AsyncTask 的示例代码(第 4 步):
private class GetContestantsAsync extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
}
@Override
protected Void doInBackground(Void... params) {
try {
String xml = getContestants("Rjfk@vDV43F", "79C8RE30-ELJD-4617-VX2D-A374C8C59E3F");
parseContestants(xml);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void result) {
}
}
调用AsyncTask如下:
GetContestantsAsync getContestantsAsync = new GetContestantsAsync();
getContestantsAsync.execute();