使用 AsyncTask 和 POST 方法将变量发送到服务器并返回 JSON 对象

Posted

技术标签:

【中文标题】使用 AsyncTask 和 POST 方法将变量发送到服务器并返回 JSON 对象【英文标题】:Use AsyncTask and POST Method to send variable to server and get JSON object back 【发布时间】:2019-09-15 20:39:12 【问题描述】:

我使用 AsyncTask 和 GET 方法将变量发送到服务器并返回 JSON 对象并解析 JSON 对象,它可以工作!

但是现在,我想更改使用 POST 方法将变量发送到服务器并获取 JSON 对象并解析 JSON 对象的方法,而不是使用 GET 方法。

我能做什么?

这是我的代码,它使用 GET 方法将变量发送到服务器并获取 JSON 对象并解析 JSON 对象:

public class MainActivity extends AppCompatActivity 

    public static String TAG = "MainActivity";

    public static String deviceIMEI;
    public static String token;
    TelephonyManager telephonyManager;

    public static String memoryToken;
    public static SharedPreferences setting;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        memoryToken = null;

        deviceId();

        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) 
            // TODO: Consider calling
            //    ActivityCompat#requestPermissions
            // here to request the missing permissions, and then overriding
            //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
            //                                          int[] grantResults)
            // to handle the case where the user grants the permission. See the documentation
            // for ActivityCompat#requestPermissions for more details.
            return;
        
        deviceIMEI = telephonyManager.getDeviceId();

        if(deviceIMEI != null)
            setting = getSharedPreferences("UserData", MODE_PRIVATE);
            memoryToken = setting.getString("Token", "");

            if(memoryToken != null && memoryToken != "")

                Intent i = new Intent(MainActivity.this, CoverActivity.class);
                startActivity(i);
            

            else if(memoryToken == "")
                new JSONTask().execute("api1" + "?deviceId=" + deviceIMEI + "&os=0");

                Intent i = new Intent(MainActivity.this, CoverActivity.class);
                startActivity(i);
            

            else

            
        

        else

        
    

    private void deviceId() 
        telephonyManager = (TelephonyManager) getSystemService(this.TELEPHONY_SERVICE);
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) 
            ActivityCompat.requestPermissions(this, new String[]Manifest.permission.READ_PHONE_STATE, 1);
            return;
        
    

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults)
        switch (requestCode) 
            case 1:
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) 
                    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) 
                        ActivityCompat.requestPermissions(this, new String[]Manifest.permission.READ_PHONE_STATE, 1);
                        return;
                    

                    String iemi = telephonyManager.getDeviceId();
                    deviceIMEI = iemi;

                    if(deviceIMEI != null)
                        new JSONTask().execute("api1" + "?deviceId=" + deviceIMEI + "&os=0");

                        Intent i = new Intent(MainActivity.this, CoverActivity.class);
                        startActivity(i);
                    

                 else 

                
                break;
            default:
                super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        
    


    public class JSONTask extends AsyncTask<String, String, String> 

        @Override
        protected String doInBackground(String... params) 
            HttpURLConnection connection = null;
            BufferedReader reader = null;

            try 
                URL url = new URL(params[0]);
                connection = (HttpURLConnection) url.openConnection();
                connection.connect();

                InputStream stream = connection.getInputStream();

                reader = new BufferedReader(new InputStreamReader(stream));

                StringBuffer buffer = new StringBuffer();

                String line = "";
                while ((line = reader.readLine()) != null) 
                    buffer.append(line);
                

                String finalJson = buffer.toString();

                try
                    JSONObject jsonObject = new JSONObject(finalJson);
                    String code = jsonObject.getString("code");
                    String desc = jsonObject.getString("desc");

                    if(Integer.valueOf(code) == 1)
                        JSONObject userInfo = jsonObject.getJSONObject("userInfo");
                        token = userInfo.getString("token");
                        Log.e(TAG, "token in JSONTask : " + token);

                        setting = getSharedPreferences("UserData", MODE_PRIVATE);
                        setting.edit().clear().commit();
                        setting.edit().putString("Token", token).commit();

                        memoryToken = setting.getString("Token", "");
                    

                    else

                    

                 catch (JSONException e) 
                    e.printStackTrace();
                

                //return buffer.toString();

             catch (MalformedURLException e) 
                e.printStackTrace();
             catch (IOException e) 
                e.printStackTrace();
             finally 
                if (connection != null) 
                    connection.disconnect();
                
                try 
                    if (reader != null) 
                        reader.close();
                    
                 catch (IOException e) 
                    e.printStackTrace();
                
            
            return null;
        

        @Override
        protected void onPostExecute(String result) 
            super.onPostExecute(result);
        
    


【问题讨论】:

看看改造库square.github.io/retrofit它也可以为你做JSON解析。这个网站有很多关于如何在你的 android 应用中实现它的很棒的教程:futurestud.io/tutorials/… 【参考方案1】:

如果您想在 HttpUrlConnection 中使用 post 发送您的数据,那么您需要将该数据写入您的正文中。

我创建了一个类,并在单个文件中添加了GETPOST 的两种方法。您只需要使用 URLParameters 调用此方法即可进行 Api 调用。

请检查此文件: https://filebin.net/rwg3i8mdpt77rju4/ApiCall.java?t=68ibdati

如果您在附件ApiCall.java 文件中看到,有两种方法。 ApiCall.getWebserviceCall()ApiCall.postWebserviceCall() 将以字符串格式返回您的 Api 响应。然后你就可以执行你的 JSON 解析代码了。

您可以使用以下方式调用 POST 和 GET 方法。根据您的 AsyncTask,您可以使用这种方法,例如,

public class JSONTask extends AsyncTask<String, String, String> 

    private Context context;

    private String deviceIMEI;
    private String os;

    public JSONTask(Context context, String deviceIMEI, String os) 
        this.context = context;
        this.deviceIMEI = deviceIMEI;
        this.os = os;
    

    @Override
    protected String doInBackground(String... params) 

        try 

            String SERVER_WS_URL = params[0];

            LinkedHashMap<String, String> parameter = new LinkedHashMap<>();
            parameter.put("deviceId", deviceIMEI);
            parameter.put("os",  "0");

            return ApiCall.postWebserviceCall(SERVER_WS_URL, params);
            // return ApiCall.getWebserviceCall(SERVER_WS_URL, params); // If you want to call GET Api

         catch (Exception e) 
            return null;
        
    

    @Override
    protected void onPostExecute(String result) 
        super.onPostExecute(result);

        try 

            if (result != null) 

                JSONObject jsonObject = new JSONObject(result.toString());

                String code = jsonObject.getString("code");
                String desc = jsonObject.getString("desc");

                if (Integer.valueOf(code) == 1) 

                    JSONObject userInfo = jsonObject.getJSONObject("userInfo");

                    token = userInfo.getString("token");
                    Log.e(TAG, "token in JSONTask : " + token);

                    setting = getSharedPreferences("UserData", MODE_PRIVATE);
                    setting.edit().clear().commit();
                    setting.edit().putString("Token", token).commit();

                    memoryToken = setting.getString("Token", "");

                 else 

                
             else 
                Toast.makeText(context, "Something went wrong", Toast.LENGTH_SHORT).show();
            

         catch (JSONException e) 
            e.printStackTrace();
        
    

现在您可以使用此 AsyncTask 调用

new JSONTask(deviceIMEI, "0").execute("api1");

【讨论】:

如果您需要更多信息,请告诉我。 如果您觉得此答案有帮助,请欣赏并投票。所以其他人可以使用相同的解决方案。 好像没有进入ApiCall类,请问如何解决,谢谢! 我用你的方法,我调用了new JSONTask(MainActivity.this, deviceIMEI, "0").execute(),但是没用!如何使用您的方法将url和两个参数发布到服务器,并从服务器返回字符串,谢谢!

以上是关于使用 AsyncTask 和 POST 方法将变量发送到服务器并返回 JSON 对象的主要内容,如果未能解决你的问题,请参考以下文章

在AsyncTask中更新UI

将字符串值分配给来自AsyncTask的onPostExecute方法的活动字符串变量不起作用

如何使用 AsyncTask 的 onPostExecute 方法更新 Android 中的变量

AsyncTask使用与源码解析

AsyncTask使用与源码解析

AsyncTask 的 get post 封装