我正在开发一个webservice调用模块,我有一个用于调用webservice的文档,它是用C#构建的,我只调用了JSON中的webservice,并且不知道如何向这样的web服务发出请求,anybuddy可以帮助我如此类型的网络服务提出请求并获得重新设置我的网络服务详细信息如下,
webservice base url:http://www.fansplay.com/wsfpbtest/FBS.svc
API名称:GetContestants
Request format:
{“ APIUserName”: “admin” , “Password”: “*****”}
Response:
{
"Contestants": [
{
"Age": 19,
"Bio": "",
"City": "Agra",
"ContestantID": 11,
"CurrentWeekPoints": 0,
"FirstName": "Merlin",
"ImageURL": "http://localhost:41800/FansPlayBachelor/Player/11.jpg",
"LastName": "M",
"Occupation": "Student",
"State": "Delhi",
"Status": "A",
"TotalPoints": 0
},
{
"Age": 25,
"Bio": "",
"City": "chennai",
"ContestantID": 12,
"CurrentWeekPoints": 0,
"FirstName": "James",
"ImageURL": "http://localhost:41800/FansPlayBachelor/Player/12.jpg",
"LastName": "S",
"Occupation": "Marketing",
"State": "tamilnadu",
"Status": "A",
"TotalPoints": 0
}
],
"ResponseCode": true,
"ResponseMessage": "Success"
}
我试过如下:
private class AsyncCaller extends AsyncTask<Void, Void, Void>
{
ProgressDialog pdLoading = new ProgressDialog(StartActivity.this);
@Override
protected void onPreExecute() {
super.onPreExecute();
//this method will be running on UI thread
pdLoading.setMessage("Loading...");
pdLoading.show();
}
@Override
protected Void doInBackground(Void... params) {
//this method will be running on background thread so don't update UI frome here
//do your long running http tasks here,you dont want to pass argument and u can access the parent class' variable url over here
HttpClient httpclient = new DefaultHttpClient();
// 2. make POST request to the given URL
HttpPost httpPost = new HttpPost("http://www.fansplay.com/wsfpbtestV3/FBS.svc/GetContestants");
String json = "";
try{
// 3. build jsonObject
JSONObject jsonObject = new JSONObject();
jsonObject.accumulate("APIUserName", "Rjfk@vDV43F");
jsonObject.accumulate("Password", "79C8RE30-ELJD-4617-VX2D-A374C8C59E3F");
// 4. convert JSONObject to JSON to String
json = jsonObject.toString();
String req =URLEncoder.encode(json, "utf-8");
// ** Alternative way to convert Person object to JSON string usin Jackson Lib
// ObjectMapper mapper = new ObjectMapper();
// json = mapper.writeValueAsString(person);
// 5. set json to StringEntity
StringEntity se = new StringEntity(req);
// 6. set httpPost Entity
httpPost.setEntity(se);
// 7. Set some headers to inform server about the type of the content
httpPost.setHeader("Accept", "application/json");
httpPost.setHeader("Content-type", "application/json");
// 8. Execute POST request to the given URL
HttpResponse httpResponse = httpclient.execute(httpPost);
// 9. receive response as inputStream
inputStream = httpResponse.getEntity().getContent();
// 10. convert inputstream to string
if(inputStream != null)
result = convertInputStreamToString(inputStream);
else
result = "Did not work!";}
catch(Exception e){
e.printStackTrace();
}
return null;
}
我不知道这是什么类型的网络服务,所以任何人都可以帮助我,因为我坚持了4天。
答案 0 :(得分:1)
这是一个返回XML或JSON的Web服务。
对于XML:
java.net.HttpURLConnection
。对于JSON:
调用Web服务所需的步骤:
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
对于XML ,示例代码(步骤2)在Web服务上调用基于GetContestants SOAP的操作:
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 ,示例代码(步骤2)调用Web服务上的GetContestants方法:
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();