【问题标题】:Retrieving xml stream from http server - android problem从http服务器检索xml流 - android问题
【发布时间】:2011-10-08 11:44:26
【问题描述】:

在我的应用程序中,我必须从服务器获取一些分配的列表。在服务器上,我有一个方法,比如说 fetchAssignments(int ,String),它接受两个值作为它的参数。

  1. 期间(今天、当月或当周)- 整数
  2. 用户 ID - 字符串

此函数将分配列表作为 XML 流返回。我知道如何连接到 http 服务器。但是我不知道如何在服务器上调用该方法并将这些参数传递给它。任何人都可以建议我做一个更好的方法...?

【问题讨论】:

    标签: android xml http stream connection


    【解决方案1】:

    您可以使用 HTTP GET 请求从服务器请求 XML 作为 InputStream,并将参数作为请求参数传递:

    http://some.server/webapp?period=1&userid=user1
    

    使用类似下面的方法,您可以从服务器获取流:

    /**
     * Returns an InputStream to read from the given HTTP url.
     * @param url
     * @return InputStream
     * @throws IOException
     */
    public InputStream get(final String url) throws IOException {
        HttpClient httpClient = new DefaultHttpClient();
        HttpParams httpParams = httpClient.getParams();
        HttpConnectionParams.setConnectionTimeout(httpParams, TIMEOUT);
        HttpConnectionParams.setSoTimeout(httpParams, TIMEOUT);
        HttpGet httpget = new HttpGet(url);
        HttpResponse httpResponse = httpClient.execute(httpget);
        StatusLine statusLine = httpResponse.getStatusLine();
        if(! statusLine.getReasonPhrase().equals("OK")) {
            throw new IOException(String.format("Request failed with %s", statusLine));
        }
        HttpEntity entity = httpResponse.getEntity();
        return entity.getContent();
    }
    

    然后您可以使用“Simple”(http://simple.sourceforge.net/) XML 库将 XML 解析为类似 JAXB 的实体:

    /**
     * Reads the XML from the given InputStream using "Simple" and returns a list of assignments.
     * @param InputStream
     * @return List<Assignment>
     */
    public List<Assignment> readSimple(final InputStream inputStream) throws Exception {
    
        Serializer serializer = new Persister();
    
        return serializer.read(AssignmentList.class, inputStream).getAssignments();     
    }
    

    我做的差不多,只是使用 REST 服务,所以我不使用请求参数。

    【讨论】:

    • HTTP POST 如果支持会更好,+1 回复 :-)
    • 如果参数匹配,是否调用服务器上的相应函数......?正如我所说,我需要在服务器上调用 fetchAssignment(int, string)...
    • 你如何在服务器上调用该函数?不通过 HTTP? JMX、RMI?
    • 仅通过 http,但我不知道如何调用。您的代码是否调用该函数?还是在服务器上调用该函数就足够了?
    • 如果您使用的是 HTTP,那么我想您在该服务器上运行了一些 Web 服务,它实现了 GET 或 POST 或两者。那么这取决于您拥有什么样的服务:Servlet、SOAP 或 REST Web 服务……您需要根据这些服务进行调用。
    【解决方案2】:

    根据语言,您可以通过 URL HTTP 请求或使用 POST 传递参数。在类的构造函数中(假设它是一个网页?.php?.aspx?)检索这些值并将它们传递给上面提到的方法?

    try{        
    HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost("http://www.yoursite.com/getfeed.php");
    InputSource inStream = new InputSource();
    
    try {
    // Add data
    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
    nameValuePairs.add(new BasicNameValuePair("period", period));
    nameValuePairs.add(new BasicNameValuePair("userid", user_id));
    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
    
     // Execute HTTP Post Request
    HttpResponse response = httpclient.execute(httppost);
    HttpEntity r_entity = response.getEntity();
    String xmlString = EntityUtils.toString(r_entity);
    
    xmlString = xmlString.trim();
    InputStream in = new ByteArrayInputStream(xmlString.getBytes("UTF-8"));
    
    if(xmlString.length() != 0){
    inStream.setByteStream(in);
    PARSE_FLAG = true;
    }
    else
    {
    PARSE_FLAG = false;
    }
    
    } catch (ClientProtocolException e) {
    // TODO Auto-generated catch block
    } catch (IOException e) {
    // TODO Auto-generated catch block
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 2016-12-12
      • 2015-09-08
      • 1970-01-01
      • 2012-05-31
      • 2012-07-07
      • 1970-01-01
      相关资源
      最近更新 更多