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