简体   繁体   English

如何使Web服务在android中请求基于C#的Web服务?

[英]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, 我正在开发一个Web服务调用模块,我有一个用C#构建的用于调用Web服务的文档,我只用JSON调用了Web服务,却不知道如何向此类Web服务发出请求,任何预算都可以帮助我如何制作一个此类Web服务请求并得到解决,我的Web服务详细信息如下,

webservice base url : http://www.fansplay.com/wsfpbtest/FBS.svc 网络服务基本网址: http://www.fansplay.com/wsfpbtest/FBS.svc : http://www.fansplay.com/wsfpbtest/FBS.svc

API name : GetContestants 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"
}

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. 我不知道这是哪种Web服务,所以自从我停留4天以来,有人可以帮我吗?

This is a Web service which returns XML or JSON. 这是一个返回XML或JSON的Web服务。

For XML: 对于XML:

  1. You can use SoapUI to test and inspect the Web service. 您可以使用SoapUI来测试和检查Web服务。
  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 . 您可以使用ksoap2-androidIceSoap之类的库将SOAP消息发送到Web服务,但是我们将使用java.net.HttpURLConnection

For JSON: 对于JSON:

  1. You can use Postman to test and inspect the Web service. 您可以使用Postman测试和检查Web服务。

The steps required to call the Web Service: 调用Web服务所需的步骤:

  1. Open your AndroidManifest.xml and add permission of internet <uses-permission android:name="android.permission.INTERNET"></uses-permission> 打开您的AndroidManifest.xml并添加Internet权限<uses-permission android:name="android.permission.INTERNET"></uses-permission>
  2. Write code which calls the GetContestants operation on the Web service. 编写代码,以调用Web服务上的GetContestants操作。
  3. Write code to parse data received from the GetContestants operation. 编写代码以解析从GetContestants操作接收的数据。
  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. 编写代码以使用AsyncTask来调用并封装上述方法,以使这不会全部发生在主UI线程上。

For XML , sample code (step 2) which calls the GetContestants SOAP based operation on the Web service: 对于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();
}

Call the above method as follows: String xml = getContestants("Rjfk@vDV43F", "79C8RE30-ELJD-4617-VX2D-A374C8C59E3F"); 调用上述方法如下: 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: 对于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();
}

Call the above method as follows: String json = getContestants("Rjfk@vDV43F", "79C8RE30-ELJD-4617-VX2D-A374C8C59E3F"); 调用上述方法,如下所示: String json = getContestants("Rjfk@vDV43F", "79C8RE30-ELJD-4617-VX2D-A374C8C59E3F");

For XML , sample code (step 3) which parses and extracts the Contestant data: 对于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
        }
    }
}

Call the above method as follows: parseContestants(xml); 调用上述方法,如下所示: parseContestants(xml);

For JSON , sample code (step 3) which parses and extracts the Contestant data: 对于JSON ,示例代码(第3步)用于解析和提取参赛者数据:

We will use GSON which is a Java library that can be used to convert a JSON string to an equivalent Java object. 我们将使用GSON,它是一个Java库,可用于将JSON字符串转换为等效的Java对象。

Add GSON to your project by adding the following line to your build.gradle file: compile 'com.google.code.gson:gson:2.4' 通过将以下行添加到build.gradle文件中,将build.gradle添加到您的项目中: compile 'com.google.code.gson:gson:2.4'

Add the following Contestant class to your project: 将以下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;
  }
}

Add the following Contestants class to your project: 将以下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;
  }
}

The above classes were generated by jsonschema2pojo 上面的类是由jsonschema2pojo生成的

To parse the JSON into their equivalent Java objects: 要将JSON解析为其等效的Java对象,请执行以下操作:

private Contestants parseContestants(String json) {
    return new Gson().fromJson(json, Contestants.class);
}

Sample code for AsyncTask (step 4): 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) {
    }
}

Call the AsyncTask as follows: 调用AsyncTask,如下所示:

GetContestantsAsync getContestantsAsync = new GetContestantsAsync();
    getContestantsAsync.execute();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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