1

自从我为 Android 编程以来已经有一段时间了,我丢失了所有以前的工作,其中包含我遇到问题的代码。我正在为 Android 和 iPhone 开发一个应用程序,它连接到同一台服务器以下载数据。在 iPhone 版本中一切都很好,但在 Android 上,当我使用包含我想在服务器上运行的方法名称的发布数据访问服务器时,似乎数据没有添加到请求中。

为什么 POST 不适用于 Android 的此请求,但适用于 iPhone 版本的应用程序?

这是我正在使用的代码:

public static void makeRequest() throws Exception {
    Thread t = new Thread() {
        public void run() {
            Looper.prepare(); //For Preparing Message Pool for the child Thread
            HttpClient client = new DefaultHttpClient();
            HttpConnectionParams.setConnectionTimeout(client.getParams(), 10000);
            HttpResponse response;
            HttpEntity entity;
            JSONObject json = new JSONObject();

            try {
                HttpPost post = new HttpPost("http://divisi.co.uk/rest/requesthandler.php");
                json.put("method", "getEventListData");

                StringEntity se = new StringEntity(json.toString());  
                se.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
                post.setEntity(se);

                response = client.execute(post);

                entity = response.getEntity();

                String retSrc = EntityUtils.toString(entity); 

                JSONObject result = new JSONObject(retSrc); //Convert String to JSON Object
                if(result.getString("SC") == "200"){
                    JSONArray data = result.getJSONArray("data");
                }
                else{

                }

            } catch(Exception e) {
                e.printStackTrace();
            }

            Looper.loop(); //Loop in the message queue
        }
    };
    t.start();
}

我从服务器得到的响应是:

{"data":{"scalar":""},"SC":405,"timestamp":1363788265}

意味着找不到方法名称,即未在我对服务器的请求中发布。

4

5 回答 5

2

这是我如何做这样的事情的一个例子:

HttpClient httpClient = new DefaultHttpClient();

HttpPost postRequest = new HttpPost("http://divisi.co.uk/rest/requesthandler.php");
MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
reqEntity.addPart(new FormBodyPart("method", new StringBody("getEventListData")));
reqEntity.addPart(new FormBodyPart("NEED_A_KEY_HERE", new StringBody("" + json.toString())));

postRequest.setEntity(reqEntity);
HttpResponse response = httpClient.execute(postRequest);
JSONObject responseDict = new JSONObject(EntityUtils.toString(response.getEntity()));
于 2013-04-11T15:22:25.027 回答
1

允许这是您的“ http://divisi.co.uk/rest/requesthandler.php ”页面代码,然后在android中您可以使用它...您不允许在您的URL中发布,

于 2013-04-09T11:55:59.800 回答
1

在您的服务器端使用提琴手。查看http消息是否正确。看来您的服务器端有问题,您能否向我们展示您接收和解析 json 的服务器端代码。

于 2013-04-11T07:36:32.020 回答
1

如果服务器无法读取您的请求,请尝试删除:

se.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));

它将使用默认的 MIME 类型 HTTP.PLAIN_TEXT_TYPE 即“text/plain”。

如果您的代码是您发布的代码而不是更复杂的输入 JSON 对象,我看不到任何其他可能性。

于 2013-04-11T15:10:45.347 回答
1

您设置 POST 正文的代码可能没问题。我认为问题可能出在您的网络服务上。尝试使用 Rested 或 curl 之类的工具手动调用您的服务器。我提出了与您提出的完全相同的请求,包括有无 POST 正文,并且我从您的服务器得到了相同的响应:

{"data":{"scalar":""},"SC":405,"timestamp":1365704082}

一些可能会绊倒你的事情:

JSONObject result = new JSONObject(retSrc); //Convert String to JSON Object
if(result.getString("SC") == "200"){
    JSONArray data = result.getJSONArray("data");
}

在这里,您正在使用 比较字符串“405”和“200” ==,此时您应该先进行空检查,然后再使用.equals("200")。或者,使用result.getInt("SC") == 200因为这是响应 JSON 中的整数类型。

此外,来自服务器响应的“数据”实体实际上并没有作为 JSON 数组返回。你应该getJSONObject("data")改用。

此外,将字符串外部化总是一个好主意。

以下是代码的外观:

public static final String JSON_KEY_SC = "SC";
public static final String JSON_KEY_DATA = "data";

...

JSONObject result = new JSONObject(retSrc); //Convert String to JSON Object

String sc = result.getString(JSON_KEY_SC);
if (sc != null && sc.equals("200")) {
    JSONObject data = result.getJSONObject(JSON_KEY_DATA);
}
else {
    ...
}
于 2013-04-11T18:33:51.213 回答