繁体   English   中英

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

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

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

网络服务基本网址: http://www.fansplay.com/wsfpbtest/FBS.svc : 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;
}

我不知道这是哪种Web服务,所以自从我停留4天以来,有人可以帮我吗?

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

对于XML:

  1. 您可以使用SoapUI来测试和检查Web服务。
  2. 您可以使用ksoap2-androidIceSoap之类的库将SOAP消息发送到Web服务,但是我们将使用java.net.HttpURLConnection

对于JSON:

  1. 您可以使用Postman测试和检查Web服务。

调用Web服务所需的步骤:

  1. 打开您的AndroidManifest.xml并添加Internet权限<uses-permission android:name="android.permission.INTERNET"></uses-permission>
  2. 编写代码,以调用Web服务上的GetContestants操作。
  3. 编写代码以解析从GetContestants操作接收的数据。
  4. 编写代码以使用AsyncTask来调用并封装上述方法,以使这不会全部发生在主UI线程上。

对于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文件中,将build.gradle添加到您的项目中: 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();

暂无
暂无

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

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