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

时间:2016-05-18 16:57:12

标签: c# android json web-services wsdl

我正在开发一个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天。

1 个答案:

答案 0 :(得分:1)

这是一个返回XML或JSON的Web服务。

对于XML:

  1. 您可以使用SoapUI来测试和检查Web服务。
  2. 您可以使用ksoap2-androidIceSoap等库将SOAP消息发送到Web服务,但我们将使用java.net.HttpURLConnection
  3. 对于JSON:

    1. 您可以使用Postman来测试和检查Web服务。
    2. 调用Web服务所需的步骤:

      1. 打开AndroidManifest.xml并添加互联网<uses-permission android:name="android.permission.INTERNET"></uses-permission>
      2. 的权限
      3. 编写在Web服务上调用GetContestants操作的代码。
      4. 编写代码以解析从GetContestants操作收到的数据。
      5. 编写代码以使用AsyncTask来调用和封装上述方法,这样就不会在主UI线程上发生这种情况。
      6. 对于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();