【问题标题】:To connect with a web-service there is two options, either use a Library or "JSONParser" Class. Which is better? which one is safe? [closed]要连接 Web 服务,有两个选项,使用库或“JSONParser”类。哪个更好?哪一个是安全的? [关闭]
【发布时间】:2017-01-17 10:59:17
【问题描述】:

我问这个是因为我是 android 开发的初学者。

我正在做一个核心银行应用程序,所以我使用 JSON Parser 类来连接 REST Web 服务,

JSONParser 类是,

package com.anvinsolutions.digicob_custmate;
import android.util.Log;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;

public class JSONParser {
String charset = "UTF-8";
HttpURLConnection conn;
DataOutputStream wr;
StringBuilder result;// = new StringBuilder();
URL urlObj;
JSONObject jObj = null;
StringBuilder sbParams;
String paramsString;

public JSONObject makeHttpRequest(String url, String method,
                                  HashMap<String, String> params) {

    sbParams = new StringBuilder();
    int i = 0;
    for (String key : params.keySet()) {
        try {
            if (i != 0){
                sbParams.append("&");
            }
            sbParams.append(key).append("=")
                    .append(URLEncoder.encode(params.get(key), charset));

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        i++;
    }

    if (method.equals("POST")) {
        // request method is POST
        try {
            urlObj = new URL(url);

            conn = (HttpURLConnection) urlObj.openConnection();

            conn.setDoOutput(true);

            conn.setRequestMethod("POST");

            conn.setRequestProperty("Accept-Charset", charset);

            conn.setReadTimeout(10000);
            conn.setConnectTimeout(15000);

            conn.connect();

            paramsString = sbParams.toString();

            wr = new DataOutputStream(conn.getOutputStream());
            wr.writeBytes(paramsString);
            wr.flush();
            wr.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    else if(method.equals("GET")){
        // request method is GET

        if (sbParams.length() != 0) {
            url += "?" + sbParams.toString();
        }

        try {
            urlObj = new URL(url);

            conn = (HttpURLConnection) urlObj.openConnection();

            conn.setDoOutput(false);

            conn.setRequestMethod("GET");

            conn.setRequestProperty("Accept-Charset", charset);

            conn.setConnectTimeout(15000);

            conn.connect();

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    try {
        //Receive the response from the server
        InputStream in = new BufferedInputStream(conn.getInputStream());
        BufferedReader reader = new BufferedReader(new InputStreamReader(in));

        result = new StringBuilder(); // add this line
        String line;
        while ((line = reader.readLine()) != null) {
            result.append(line);
        }

        Log.d("JSON Parser", "result: " + result.toString());

    } catch (IOException e) {
        e.printStackTrace();
    }

    conn.disconnect();

    // try parse the string to a JSON object
    try {
        jObj = new JSONObject(result.toString());
    } catch (Exception e) {
        Log.e("JSON Parser", "Error parsing data " + e.toString());
    }

    // return JSON Object
    return jObj;
}
}

如果这种方法在安全性、性能方面有任何问题,我会感到困惑? 直到现在我还没有尝试任何库,我只是使用了这个 JSONParaser 类。我认为它很容易使用 JSONParser 类..

使用哪一个? 先感谢您! ;)

【问题讨论】:

  • JSONParser 不是要走的路。你是在哪里拿到的?我不会称之为好代码。
  • 我是从 github 上得到的.. 但它工作正常.. 到目前为止没有问题.. 但我不知道它是否安全!
  • 如果 Web 服务不返回 JSON,这个类会做什么?使用 HttpClient,例如 Apache 中的那个。这是错误的方式。
  • 不,在我们的应用程序中,我们只使用 JSON 请求和响应..
  • @duffymo 在 Android 中不鼓励使用 HttpClient。自定义 Android HTTP 堆栈和 OkHttp 等其他东西针对移动设备进行了优化

标签: android android-studio android-json android-webservice


【解决方案1】:

您从不使用 JSonParser 类连接到 Web 服务。从您的代码来看,您似乎正在使用 Vanilla HttpURLConnection 类来连接到服务并使用 JSonParser 类来解析结果,如果您的应用程序中只有几个 Web 请求要发出,那么这很好且简单。

但是,既然您说它是银行应用程序,您可能必须考虑可扩展性、多个请求和类似的东西。您可以尝试自己处理它们,但建议的方法是使用可用于 Android 的久经考验的网络库之一。 Retrofit 和 Volley 就是这样的两个,还有更多。要使用的库的选择取决于您的用例。

@AJay 已经指向一个页面进行比较。看看吧。

接下来,关于解析,性能是关键因素之一。请查看以下链接以了解您拥有的选项 - http://blog.takipi.com/the-ultimate-json-library-json-simple-vs-gson-vs-jackson-vs-json/

我会说 GSon 在所有这些中都相当不错。我们在内部产品中广泛使用它。

【讨论】:

  • 正如你所说,实际上我使用一些简单的 Web 服务调用来查询余额、现金存款、转账等。但是正如你们都建议使用库..所以我需要使用库。 . 我需要更改我所有的代码 :( 因为我使用这个 JSON 解析器类来处理我的所有请求和响应 :P :P
【解决方案2】:

您可以使用 Google 提供的 GsonParser。https://github.com/google/gson

【讨论】:

  • 谢谢 :) 哦,它来自谷歌?所以它肯定是安全的!我说的对吗?
  • 是的,这是真的。 :)
【解决方案3】:

您好,您可以使用这 3 个库中的任何一个,它们的性能都一样好。检查此链接,它将对您有所帮助。快乐学习。

Comparison of Android networking libraries: OkHTTP, Retrofit, and Volley

【讨论】:

    【解决方案4】:

    如果你有 REST 服务,最简单的方法是使用 Retrofit 库:https://square.github.io/retrofit/ 使用 Retrofit,您无需实现 http 调用,它会自动解析/创建 json。

    如果你需要更大的灵活性,我建议使用 OkHttp 库 http://square.github.io/okhttp/,它比纯 HttpUrlConnection 结合 Gson 库 https://github.com/google/gson 进行 json 解析/创建要简单得多。

    【讨论】:

    • 好的,谢谢。我有一个改造示例代码,我正在处理 REST Web 服务。
    猜你喜欢
    • 1970-01-01
    • 2023-04-07
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-26
    • 2015-06-10
    • 1970-01-01
    相关资源
    最近更新 更多