使用 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 发送您的数据,那么您需要将该数据写入您的正文中。
我创建了一个类,并在单个文件中添加了GET
和POST
的两种方法。您只需要使用 URL
和 Parameters
调用此方法即可进行 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的onPostExecute方法的活动字符串变量不起作用