我拼命试图解决我的android应用程序的问题。我将枚举设置为“标签”的列表提交到服务器。 PHP页面应查看此标记,然后继续执行相关功能,并以json数组或对象的形式返回。此功能适用于该应用程序的一个版本,但克隆版本无法获取数据。 PHP只是直接跳过了isset标记处的标记检查,并且标记不是空条件,因此看到一个空的POST或我提交的对象不符合我不知道的某些要求时,它一定可以完全解决。
我浏览了这么多帖子并进行了搜索,但没有找到解决方案。为什么它不能用于该应用程序的一个版本,却不能用于升级版本,而升级版本没有对用于发送数据的方法进行任何更改?
所以这就是我要处理的。首先,AsyncTask接收对象并传递给处理通信的类:
private class UpdateJobList extends AsyncTask<User, Void, Boolean> {
private List<Message> messages;
public UpdateJobList() {
super();
messages = new ArrayList<Message>();
}
@Override
protected Boolean doInBackground(User... params){
try {
CloudConnect cConn = new CloudConnect(sAddress);
this.messages = cConn.getAll(params[0]);
return true;
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
@Override
protected void onPostExecute(Boolean result) {
if (true)
{
handleMessageList(messages);
}
}
}
使用CloudConnect类获取单个Json对象或对象数组:
public class CloudConnect {
private String site;
private InputStream is;
private Gson gson;
public CloudConnect(String site) throws MalformedURLException {
this.site = site;
this.gson = new GsonBuilder().setDateFormat("yyyy-MM-dd").create();
is = null;
}
public synchronized Message get(Message m) throws IOException {
Message msg = null;
HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost(this.site);
post.setEntity(new UrlEncodedFormEntity(validateMessage(m)));
HttpResponse response = client.execute(post);
StatusLine status = response.getStatusLine();
if ( status.getStatusCode() == 200) {
HttpEntity entity = response.getEntity();
is = entity.getContent();
try {
Reader read = new InputStreamReader(is);
String str = (String) gson.fromJson(read, Object.class);
JsonParser parser = new JsonParser();
JsonElement jElem = parser.parse(str);
JsonObject jObject = (JsonObject) jElem;
msg = gson.fromJson(jObject, Message.class);
is.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return msg;
}
public synchronized List<Message> getAll(Message m) throws IOException {
List<Message> mList = new ArrayList<Message>();
HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost(this.site);
post.setEntity(new UrlEncodedFormEntity(validateMessage(m)));
HttpResponse response = client.execute(post);
StatusLine status = response.getStatusLine();
if ( status.getStatusCode() == 200) {
HttpEntity entity = response.getEntity();
is = entity.getContent();
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
JsonArray jArray = null;
JsonReader jReader = new JsonReader(reader);
jReader.setLenient(true);
JsonParser parser = new JsonParser();
if (parser.parse(jReader).isJsonArray()){
jArray = parser.parse(jReader).getAsJsonArray();
if ( m instanceof User ){
for (JsonElement je : jArray) {
mList.add(gson.fromJson(je, Job.class));
Log.d("json", je.toString());
}
} else if ( m instanceof Job ) {
for (JsonElement je : jArray) {
mList.add(gson.fromJson(je, Update.class));
Log.d("json", je.toString());
}
}
} else {
JsonElement jElem = parser.parse(jReader);
JsonObject jObject = (JsonObject) jElem;
Error msg = null;
msg = gson.fromJson(jObject, Error.class);
mList.add(msg);
}
is.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return mList;
}
以及用于检查标记的PHP代码:
if ( isset($_POST['messageType']) && $_POST['messageType'] != "") {
$tag = $_POST['messageType'];
//
//various functions depending on messageType tag here. Such as getUser($email).
//functions appear to work fine if the PHP doesn't find the initial conditions
//false and skips them all.
} else {
$response["success"] = 0;
$response["error"]["errorMsg"] = "Tags are null";
$response["error"]["messageType"] = $tag;
$response["error"]["varDump"] = var_dump($_POST);
echo json_encode($response);
}
参考方案
好吧,现在我明白了。您在Android代码上没有问题,但是在PHP中(我因为TAG Android而来到这里)。我不是PHP方面的专家,但是请记住isset ($ _POST ['messageType'])
returns true
only if the payload of your POST request contains something like: messageType=some_value.,因此您需要检查传递给post.setEntity(value)
的值是否采用这种格式。
您可以使用Fiddler之类的工具查看请求的负载并进行正确调试。
使用Java和PHP的BCrypt,发送加密的密码并对其进行解码 - java我想使用Android应用程序将加密的密码发送到存储该密码的服务器上的PHP文件。到目前为止,这也有效。在登录时,我再次将加密的密码发送到服务器,PHP文件应找出密码是否正确。但是如果我现在如果(password_verify($ userPassword,$ hash)){}那么该功能需要真实密码,而不需要加密密码。我现在如何比较加密和加密?还是只需要将可…
我可以只加载一次大量数据并在每个请求中使用它吗? - java有没有一种方法可以将大数据对象加载到内存中,通常仅在每次请求时才将其加载一次?在Java中,可以在加载Servlet时实例化Servlet中的对象,但是一旦到达该对象,就可以在任何请求中使用它。示例如下。可以用PHP完成吗?public class SampleServlet extends HttpServlet { private static Huge…
包含php的js函数在未调用时执行 - java我的页面标签中包含以下代码:<script> function LogInOut() { // Get the current login status alert("executing LogInOut"); $loginStatus = "<?php echo $_SESSION['login…
Java-搜索字符串数组中的字符串 - java在Java中,我们是否有任何方法可以发现特定字符串是字符串数组的一部分。我可以避免出现一个循环。例如String [] array = {"AA","BB","CC" }; string x = "BB" 我想要一个if (some condition to tell wheth…
PHP Count数组元素 - php嗨,有人可以解释为什么这会返回“数组由0个元素组成”。 :$arr = array(1,3,5); $count = count($arr); if ($count = 0) { echo "An array is empty."; } else { echo "An array has $count elements.…