0

我正在拼命尝试解决我的 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);
}
4

1 回答 1

1

好的,现在我明白了。你的 Android 代码没有问题,但是 PHP (我来这里是因为 TAG Android)。我不是 PHP 专家,但请记住,仅当您的 POST 请求的有效负载包含以下内容时才会isset ($ _POST ['messageType'])返回true:messageType=some_value。所以你需要检查你传递给的值是否post.setEntity(value)是这种格式的东西。

您可以使用Fiddler之类的工具来查看请求的有效负载并正确调试。

于 2013-10-24T03:05:18.590 回答