如何提高联系WebService的性能?

时间:2013-08-14 07:58:54

标签: php android web-services httprequest androidhttpclient

我有一个与WebService通信的Android应用程序。我的应用程序向Web服务发送请求,该请求以php编写。 php方面,只需处理echo格式的请求和JSON结果。

虽然传输的数据量很少,但有时在我的应用中加载数据需要很长时间。

以下是我的Android应用中的方法,负责发送请求检索响应

/**
 * Posts data to server.
 * 
 * @param url Server URL
 * @param json {@link JSONObject} to be sent
 * @param tag Tag. used to describe the request
 * @return {@link HttpResponse}
 * @throws IOException
 * @throws ClientProtocolException
 */
public HttpResponse postData(String url, JSONObject json, String tag)
        throws ClientProtocolException, IOException {
    SharedPreferences prefs = context.getSharedPreferences(SUPPORTDESK, Context.MODE_PRIVATE);
    HttpResponse httpResponse = null;

    String jsonString = json.toString();
    String encodedURL = URLEncoder.encode(jsonString, HTTP.UTF_8);

    List<NameValuePair> value = new ArrayList<NameValuePair>();
    value.add(new BasicNameValuePair("username", prefs.getString(USERNAME_KEY, "")));
    value.add(new BasicNameValuePair("password", prefs.getString(PASSWORD_KEY, "")));
    value.add(new BasicNameValuePair("tag", tag));
    value.add(new BasicNameValuePair("data", encodedURL));

    DefaultHttpClient httpClient = new DefaultHttpClient();
    //setTimeout(httpClient, 5000);
    HttpPost request = new HttpPost(url);

    // StringEntity entity = new StringEntity(jsonString);
    // request.setHeader("Content-Type", "application/json");
    // request.setEntity(entity);
    request.setEntity(new UrlEncodedFormEntity(value, HTTP.UTF_8));

    httpResponse = httpClient.execute(request);

    return httpResponse;

}

/**
 * Retrieves String representation of {@link HttpResponse}
 * 
 * @param response {@link HttpResponse}
 * @return <b>String</b> Actual Response from server as string.
 * @throws IOException
 * @throws IllegalStateException
 * @throws UnsupportedEncodingException
 */
public static String getServerResponse(HttpResponse response)
        throws IOException, IllegalStateException,
        UnsupportedEncodingException {

    InputStream is = response.getEntity().getContent();
    BufferedReader reader = new BufferedReader(new InputStreamReader(is,
            HTTP.UTF_8), 100);
    StringBuilder sb = new StringBuilder();
    String line = null;

    while ((line = reader.readLine()) != null) {
        sb.append(line + "\n");
    }

    is.close();
    String out = URLDecoder.decode(sb.toString().trim(), HTTP.UTF_8).trim();
    int ascii = (int) out.charAt(0);

    return (ascii >= 33 & ascii <= 126)?out:out.substring(1);
}

postData方法将发送请求并等待响应,然后响应将传递给getServerResponse以检索响应的字符串表示。当然,所有long-Running代码都包含在AsyncTask类中。

以下是我的网络服务的示例方法:

function transactionDetail($json) {
    $array = json_decode($json, TRUE);
    $db = new DBHelper();
    $transactionId = $array[$db->JS_RP_TRANSACTION_ID];
    $response = $db->getTransactionDetails($transactionId);
    echo urlencode(json_encode($response));
}

那么,我正在 Android Side 上使用的方法来发出请求并检索响应,标准方法,或者有更好的方法?

如何为我发出的请求设置超时?,您可以在我的代码中看到一条注释行,我试图设置超时但是它破坏了代码。

Client/Server side代码的组合我使用得还不够,还是有更多标准或改进的方法来实现这个我不知道的?

1 个答案:

答案 0 :(得分:2)

我使用完全相同的代码来更新我的应用程序中的数据库,我使用php / echo / json发送大量数据,而且我唯一一次遇到减速的时候是因为网速很低或者服务器变慢。

升级到更好的服务器后,此操作只需几秒钟即可完成,即手机上的信号强度变低,数据传输速度变慢,拨号速度降低或更低......

您的PHP代码和java代码是正确的,我怀疑问题出在你的服务器上。您应该在手机处于Wi-Fi状态时进行测试,以获得良好的信号强度以排除网速,并测试您的数据库HELPER在php中获取结果需要多长时间。如果它的SQL连接而不是Mongo或其他东西,它应该比50ms更快地工作,即使是10 000行的结果。 (根据我自己的经验)