Reputation: 585
I am working on a webservice calling module,I have a document for calling webservice which is built in C#,i have called webservice in JSON only and have no idea how to make a request to such webservices,Can anybuddy help me how to make a request and getting respose fron such kind of webservice my webservice details are as below,
webservice base url : http://www.fansplay.com/wsfpbtest/FBS.svc
API name : 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"
}
I have tried as below:
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;
}
I have no idea which kind of webservice this is,So can anybody please help me as i stuck since 4 days in this.
Upvotes: 0
Views: 676
Reputation: 2024
This is a Web service which returns XML or JSON.
For XML:
java.net.HttpURLConnection
.For JSON:
The steps required to call the Web Service:
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
For XML, sample code (step 2) which calls the GetContestants SOAP based operation on the Web service:
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();
}
Call the above method as follows: String xml = getContestants("Rjfk@vDV43F", "79C8RE30-ELJD-4617-VX2D-A374C8C59E3F");
For JSON, sample code (step 2) which calls the GetContestants method on the Web service:
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();
}
Call the above method as follows: String json = getContestants("Rjfk@vDV43F", "79C8RE30-ELJD-4617-VX2D-A374C8C59E3F");
For XML, sample code (step 3) which parses and extracts the Contestant data:
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
}
}
}
Call the above method as follows: parseContestants(xml);
For JSON, sample code (step 3) which parses and extracts the Contestant data:
We will use GSON which is a Java library that can be used to convert a JSON string to an equivalent Java object.
Add GSON to your project by adding the following line to your build.gradle
file: compile 'com.google.code.gson:gson:2.4'
Add the following Contestant
class to your project:
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;
}
}
Add the following Contestants
class to your project:
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;
}
}
The above classes were generated by jsonschema2pojo
To parse the JSON into their equivalent Java objects:
private Contestants parseContestants(String json) {
return new Gson().fromJson(json, Contestants.class);
}
Sample code for AsyncTask (step 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) {
}
}
Call the AsyncTask as follows:
GetContestantsAsync getContestantsAsync = new GetContestantsAsync();
getContestantsAsync.execute();
Upvotes: 1