如何在后台正确使用Android的HTTP POST方法

时间:2018-04-18 15:48:03

标签: java android post

任务很简单,但我希望以正确的方式做到这一点,我很想听听你的专家意见,因为我是android开发的新手。

首先,应用程序只适合我,所以我真的不关心安全性和东西。

所以我的目标是这样的:

我有大量数据需要传输到我的MYSQL数据库,对我来说最简单的方法是使用HTTP POST方法,但我担心应用程序可能卡住的部分或某些数据赢了“由于许多POST请求将会通过。

那么我应该如何使用POST请求传递数据,并确保所有请求都将逐个发送而不会跳过任何数据丢失或丢失数据?

这背后的逻辑就足够了我真的不需要代码部分。 希望我足够清楚。

2 个答案:

答案 0 :(得分:1)

改造FTW。在Android(RESTful)上轻松实现网络,它包括Gson。 说到Gson ...你提到你可能会发许多帖子?如果是这样,您应该将数据转换为JSON,然后通过网络发送。 Google的Gson是一种将Java对象轻松转换为JSON的绝佳方式。   http://square.github.io/retrofit/   https://github.com/google/gson

答案 1 :(得分:0)

在阅读之前: 这是我实现帖子和获取的方式,这不是最好的方式,但只是满足我需求的最佳方式,随时编辑/不使用/自己实施

我个人更喜欢OkHTTP library,它易于使用且易于实施。

实施非常简单,只需在Gradle应用级

中添加此行即可
implementation 'com.squareup.okhttp3:okhttp:3.9.0'

然后我为get和post调用创建了一个帮助类(我不需要很多配置,所以对我来说静态的就足够了,如果你需要更多的东西你可以轻松实现。还有超时设置为我的需求,你可以自由地改变它们。)

private String ConsumeGetRequest(String path) {
    int tries = 0;
    boolean isMyException = true;
    while (tries <= 3 && isMyException) {
        try {
            isMyException = false;
            tries++;
            Response response = executeRequestBody(path, null);
            if (response != null && response.body() != null)
                return response.body().string();
            else
                return "";

        } catch (ConnectException e) {
            e.printStackTrace();
            if (e.getMessage().contains("Failed to connect to") && tries <= 3) {
                isMyException = true;
            }
        } catch (Exception ex) {
            ex.printStackTrace();
            return "";
        }
    }
    return "";
}

private Pair<Boolean, String> ConsumePostRequest(String path, String postData) {
    int tries = 0;
    String errorMsg = null;
    boolean isMyException = true;
    //you can ignore this while, it was for our internal reasons and it's just a check.
    while (tries <= 3 && isMyException) {
        try {
            isMyException = false;
            tries++;
            Response response = executeRequestBody(path, postData);
            if (response != null && response.body() != null)
                return new Pair<>(response.isSuccessful(), response.body().string());
            else
                return new Pair<>(false, null);
        } catch (ConnectException e) {
            errorMsg = e.getMessage();
            if (e.getMessage().contains("Failed to connect to") && tries <= 3) {
                isMyException = true;
            }
        } catch (Exception ex) {
            errorMsg = ex.getMessage();
        }
    }
    return new Pair<>(false, errorMsg);
}

private Response executeRequestBody(String path, String postData) throws IOException {
    String url = String.format("%s%s/", RuntimeHelper._baseWebServiceIP, path);
    if (okHttpClient == null) {
        okHttpClient = new OkHttpClient.Builder()
                .connectTimeout(10, TimeUnit.SECONDS)
                .writeTimeout(120, TimeUnit.SECONDS)
                .readTimeout(120, TimeUnit.SECONDS)
                .build();
    }
    Request.Builder builder = new Request.Builder().url(url);
    if (postData != null && !postData.isEmpty()) {
        RequestBody body = RequestBody.create(RuntimeHelper._okHttpTypeJson, postData);
        builder = builder.post(body);
    }
    Request request = builder.build();

    return okHttpClient.newCall(request).execute();
}

使用这两种方法(几个例子)我创建了我的路径,并根据我的需要调用了正确的方法。

//Post
    public boolean setAlerts(String postData) {
        String path = String.format("api/wfm/v1/set-alerts/%s/%s", authToken, resourceId);
        return ConsumePostRequest(path, postData).first;
    }

    //Post
    public String isAlertUpdated(String lastDownloadDate) {
        String path = String.format("api/wfm/v1/is-alert-updated/%s/%s", authToken, lastDownloadDate);
        return ConsumeGetRequest(path);
    }

然后使用AsyncTask,您可以在不阻止UI的情况下执行操作

public class NewAlertAsyncTask extends AsyncTask<String, String, Boolean> {

    Context context;

    private WebApiMethodsController webApiMethodsController;
    AuthenticatedUser authenticatedUser;

    public NewAlertAsyncTask(Context ctx) {
        this.context = ctx;
        authenticatedUser = AuthenticatedUser.getIstance(context);
        webApiMethodsController = new WebApiMethodsController(authenticatedUser.getAuthenticationTokenID().toString(), authenticatedUser.getResourceID().toString(), context);
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected void onProgressUpdate(String... values) {
    }

    @Override
    protected Boolean doInBackground(String... datas) {
        Boolean result;
        try {
            result = webApiMethodsController.setAlerts(datas[0]);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return result;
    }

    @Override
    protected void onPostExecute(Boolean s) {
        if(s){
            //manage succes, I use this
            mCallback.onNewAlertCreated();
        }
        else{
            //manage error
        }
    }
}

我的是一个非常简单的结构,您可以通过回调,状态进度,更深入的返回状态检查来实现它......

您只需使用此

调用asynctask即可
            NewAlertAsyncTask newAlertAsyncTask = new NewAlertAsyncTask(getActivity());
            newAlertAsyncTask.execute(gson.toJson(alertList));