简体   繁体   中英

How to make a webservice to request to C# based webservice in android?

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.

This is a Web service which returns XML or JSON.

For XML:

  1. You can use SoapUI to test and inspect the Web service.
  2. You can use libraries like ksoap2-android or IceSoap to send SOAP Messages to the Web service but we will use java.net.HttpURLConnection .

For JSON:

  1. You can use Postman to test and inspect the Web service.

The steps required to call the Web Service:

  1. Open your AndroidManifest.xml and add permission of internet <uses-permission android:name="android.permission.INTERNET"></uses-permission>
  2. Write code which calls the GetContestants operation on the Web service.
  3. Write code to parse data received from the GetContestants operation.
  4. Write code to use an AsyncTask which calls and encapsulates the above methods so that this doesn't all take place on the main UI thread.

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();

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM