我目前正在尝试从Android应用程序向php服务器发送数据(两者均由我控制)。
应用程序中的表单上收集了很多数据,这些数据已写入数据库。所有这一切。
在我的主代码中,首先我创建一个JSONObject(在此示例中,我已在此处将其裁剪):
JSONObject j = new JSONObject(); j.put("engineer", "me"); j.put("date", "today"); j.put("fuel", "full"); j.put("car", "mine"); j.put("distance", "miles");
接下来,我将对象传递给发送对象,并接收响应:
String url = "http://www.server.com/thisfile.php"; HttpResponse re = HTTPPoster.doPost(url, j); String temp = EntityUtils.toString(re.getEntity()); if (temp.compareTo("SUCCESS")==0) { Toast.makeText(this, "Sending complete!", Toast.LENGTH_LONG).show(); }
HTTPPoster类:
public static HttpResponse doPost(String url, JSONObject c) throws ClientProtocolException, IOException { HttpClient httpclient = new DefaultHttpClient(); HttpPost request = new HttpPost(url); HttpEntity entity; StringEntity s = new StringEntity(c.toString()); s.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json")); entity = s; request.setEntity(entity); HttpResponse response; response = httpclient.execute(request); return response; }
这将获得响应,但是服务器返回403-禁止响应。
我试过稍微更改doPost函数(实际上好一点,正如我说的,我有很多东西要发送,基本上是3个具有不同数据的相同表单- 所以我创建了3个JSONObject,每个表单项一个-条目来自数据库而不是我使用的静态示例)。
首先,我将通话更改了一点:
String url = "http://www.myserver.com/ServiceMatalan.php"; Map<String, String> kvPairs = new HashMap<String, String>(); kvPairs.put("vehicle", j.toString()); // Normally I would pass two more JSONObjects..... HttpResponse re = HTTPPoster.doPost(url, kvPairs); String temp = EntityUtils.toString(re.getEntity()); if (temp.compareTo("SUCCESS")==0) { Toast.makeText(this, "Sending complete!", Toast.LENGTH_LONG).show(); }
好的,对doPost函数的更改如下:
public static HttpResponse doPost(String url, Map<String, String> kvPairs) throws ClientProtocolException, IOException { HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost(url); if (kvPairs != null && kvPairs.isEmpty() == false) { List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(kvPairs.size()); String k, v; Iterator<String> itKeys = kvPairs.keySet().iterator(); while (itKeys.hasNext()) { k = itKeys.next(); v = kvPairs.get(k); nameValuePairs.add(new BasicNameValuePair(k, v)); } httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); } HttpResponse response; response = httpclient.execute(httppost); return response; }
好的,这将返回响应200
int statusCode = re.getStatusLine().getStatusCode();
但是,服务器上接收到的数据无法解析为JSON字符串。我认为它的格式有误(这是我第一次使用JSON):
如果在php文件中,我在$ _POST [‘vehicle’]上执行回显,则得到以下信息:
{\"date\":\"today\",\"engineer\":\"me\"}
谁能告诉我我哪里出问题了,或者是否有更好的方法来实现我的目标?希望以上是有道理的!
经过大量阅读和搜索之后,我发现问题出在哪里,我相信在服务器上启用了magic_quotes_gpc。
因此,使用:
json_decode(stripslashes($_POST['vehicle']));
在上面的示例中,删除了斜杠,并允许对JSON进行正确解码。
仍然不确定为什么发送StringEntity会导致403错误?