【问题标题】:How to call PHP web service in Android application?如何在 Android 应用程序中调用 PHP Web 服务?
【发布时间】:2012-12-23 06:06:10
【问题描述】:

我正在开发一个 Android 应用程序,其中所有数据都来自 PHP Web 服务。现在我很困惑如何做到这一点。我应该在 PHP 中开发哪个 Web 服务(ksoap、soap、rest 等),以便当我在 Android 中调用该 Web 服务时它是轻量级的?我需要为这种类型的应用程序做些什么?目前我也在本地制作应用程序,因此 PHP 将从 mysql 数据库中获取数据。请建议我应该开发哪个网络服务。如何在 Android 应用程序中调用它?另外我想知道我是否可以在 Android 本身中开发 Web 服务,因为我只有静态数据要传递,可能需要输入 2 或 3 个数据。

【问题讨论】:

    标签: php android web-services


    【解决方案1】:

    我不建议您使用 SOAP,实施起来不舒服。 我花了很多时间来解析这些来自 SOAP 服务的元素,我建议你实现JSON webservice。

        /*web service parameters*/
        private static final String TAG = RestSearchResultList.class.getSimpleName();
        private static final String SOAP_ACTION = "http://tempuri.org/GetSomething";
        private static final String METHOD_NAME = "GetSomething";
        private static final String NAMESPACE = "http://tempuri.org/";
        private static final String URL = "http://www.yoursite.com /Services/webservice.asmx";
    

    服务调用:

    private SoapObject CallWebService() {
        try {
                SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
                request.addProperty("lang", Language);
                request.addProperty("restTitle", mSearchText);          
                request.addProperty("x", mLongitude);
                request.addProperty("y", mLatitude);
    
    
                SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
                envelope.implicitTypes = true;
                envelope.dotNet = true;
                envelope.encodingStyle = SoapSerializationEnvelope.XSD;
                envelope.setOutputSoapObject(request);
    
                MarshalDouble md = new MarshalDouble();
                md.register(envelope);
    
                HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
                androidHttpTransport.call(SOAP_ACTION, envelope);
                SoapObject result = (SoapObject) envelope.getResponse();
    
                SearchingMap.getInstance().Clear();
                return result;
            } catch (Exception ex) {
                Log.e(TAG, ex.getMessage());
            }
            return null;
    }
    

    这只是调用服务,不解析它和其他东西。

    JSON 示例:

      public class AsyncJsonDataTask extends AsyncTask<String, Integer, JSONArray> {
        private JsonLoader _jsonHelper;
        private IJsonDataListener _dataListener;
        private ProgressDialog _dialog;
    
        /*Progress bar widget initialize*/
        public AsyncJsonDataTask(IJsonDataListener dataListener, ProgressDialog dialog) {
            _dataListener = dataListener;
            _jsonHelper = new JsonLoader();
            _dialog = dialog;
        }
    
        @Override
        protected JSONArray doInBackground(String... urls) {
            JSONArray result = _jsonHelper.GetJSONArray(urls[0]);
            return result;
        }
    
        @Override
        protected void onPostExecute(JSONArray result) {
            if (_dialog != null) {
                if (_dialog.isShowing()) {
                    _dialog.dismiss();
                }
            }
            _dataListener.OnJsonDataLoadComplete(result); //gets data oncomplete
        }
    
        @Override
        protected void onProgressUpdate(Integer... progress) {
        }
    
        @Override
        protected void onPreExecute() {
            if (_dialog != null) {
                _dialog.setMessage("Load Data");
                _dialog.show();
            }
        }
    }
    
    public class JsonHelper {
        /* public static Object toJSON(Object object) throws JSONException {
                if (object instanceof Map) {
                    JSONObject json = new JSONObject();
                    Map map = (Map) object;
                    for (Object key : map.keySet()) {
                        json.put(key.toString(), toJSON(map.get(key)));
                    }
                    return json;
                } else if (object instanceof Iterable) {
                    JSONArray json = new JSONArray();
                    for (Object value : ((Iterable)object)) {
                        json.put(value);
                    }
                    return json;
                } else {
                    return object;
                }
            }
    
            public static boolean isEmptyObject(JSONObject object) {
                return object.names() == null;
            }
    
            public static Map<String, Object> getMap(JSONObject object, String key) throws JSONException {
                return toMap(object.getJSONObject(key));
            }
    
            public static Map<String, Object> toMap(JSONObject object) throws JSONException {
                Map<String, Object> map = new HashMap();
                Iterator keys = object.keys();
                while (keys.hasNext()) {
                    String key = (String) keys.next();
                    map.put(key, fromJson(object.get(key)));
                }
                return map;
            }
    
            public static List toList(JSONArray array) throws JSONException {
                List list = new ArrayList();
                for (int i = 0; i < array.length(); i++) {
                    list.add(fromJson(array.get(i)));
                }
                return list;
            }
    
            private static Object fromJson(Object json) throws JSONException {
                if (json == JSONObject.NULL) {
                    return null;
                } else if (json instanceof JSONObject) {
                    return toMap((JSONObject) json);
                } else if (json instanceof JSONArray) {
                    return toList((JSONArray) json);
                } else {
                    return json;
                }
            }*/
    }
    

    我在整个项目中写过一次,没有配置和东西,我在这里保留了SRP,你可以检查你需要什么并使用它。

    【讨论】:

      【解决方案2】:

      由于您需要小数据而且这也是本地的,所以最好选择 REST,因为它不需要任何额外的东西,如 KSOAP 或其他任何东西。如果存在分布式环境,那么 SOAP 更好。在你的情况下,我认为 REST 很好。

      Here 是您可以查看的链接。

      【讨论】:

      • REST 能否用于从数据库中获取数据?我的意思是我没有使用在线网站数据。我只使用笔记本电脑上的本地数据。
      • @Dhwani 你有 web 服务,它会返回你从数据库中获取的数据,所以你必须在 webservice 中实现它。你可以在我提供的链接中看到。你必须得到那个数据在你的 android prpject 中,并使用 json 解析技术或 xmlparsing 技术对其进行解析。
      • 好的,谢谢。我浏览了你的网站。它帮助了我。但我几乎没有疑问它是基本的 Web 服务,但属于什么类型(REST/SOAP)?
      • 非常感谢。这对我帮助很大。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-21
      • 1970-01-01
      相关资源
      最近更新 更多