发送JSON Post Android时出现问题

发送JSON Post Android时出现问题,android,json,post,Android,Json,Post,自从我为Android编程已经有一段时间了,我已经丢失了我以前所有的工作,这些工作中有我遇到问题的代码。我正在为Android和iPhone开发一个应用程序,连接到同一台服务器下载数据。在iPhone版本中一切都很好,但在Android上,当我用包含我希望在服务器上运行的方法名的post数据点击服务器时,数据似乎没有添加到请求中 为什么这篇文章在Android应用程序的请求中不起作用,但在iPhone版本的应用程序中起作用 以下是我正在使用的代码: public static void make

自从我为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}

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

允许这是您的页面代码,然后在android中您可以使用此。。。您不允许在您的URL中发布帖子,

允许这是您的页面代码,然后在android中您可以使用此。。。您不允许在URL中发布帖子,请在服务器端使用fiddler。查看http消息是否正确。这似乎是您的服务器端问题,您能否向我们展示接收和解析json的服务器端代码。

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

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

se.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
它将使用默认的mime类型HTTP.PLAIN\u TEXT\u类型,即TEXT/PLAIN


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

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

se.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
它将使用默认的mime类型HTTP.PLAIN\u TEXT\u类型,即TEXT/PLAIN


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

以下是我如何执行类似操作的示例:

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()));

下面是我如何做这类事情的一个例子:

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()));

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

{"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进行比较,此时您应该首先执行空检查,然后使用.equals200。或者,使用result.getIntSC==200,因为这是响应JSON中的整数类型

此外,服务器响应中的数据实体实际上并不是作为JSON数组返回的。您应该改用getJSONObjectdata

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

下面是代码的外观:

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 {
    ...
}

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

{"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进行比较,此时您应该首先执行空检查,然后使用.equals200。或者,使用result.getIntSC==200,因为这是响应JSON中的整数类型

此外,服务器响应中的数据实体实际上并不是作为JSON数组返回的。您应该改用getJSONObjectdata

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

下面是代码的外观:

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 {
    ...
}

尝试将日志添加到服务器端,并查看它接收到什么。您可能只是输入了错误的方法名称或忘记了一些额外的参数。您的Web服务的请求结构是什么?您可以在这里发布您的iPhone代码,同时可以尝试:post.setHeaderContent-Type,text/json;post.setEntityse;尝试将日志添加到服务器端,并查看它接收到什么。您可能只是输入了错误的方法名称或忘记了一些额外的参数。您的Web服务的请求结构是什么?您可以在这里发布您的iPhone代码,同时可以尝试:post.setHeaderContent-Type,text/json;post.setEntityse;