Android JSON HttpClient使用HttpResponse将数据发送到PHP服务器

Sco*_*ler 23 php android json httpresponse httpclient

我目前正在尝试将一些来自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");
Run Code Online (Sandbox Code Playgroud)

接下来,我将对象传递给发送,并收到响应:

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();
}
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

这会得到响应,但服务器返回403 - 禁止响应.

我试过稍微更改一下doPost函数(这实际上好一点,因为我说我有很多发送,基本上有3个相同的表单和不同的数据 - 所以我创建3个JSONObjects,每个表单条目一个 - 条目来自DB而不是我正在使用的静态示例).

首先,我稍稍改变了呼叫:

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();
}
Run Code Online (Sandbox Code Playgroud)

好吧,对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;
}
Run Code Online (Sandbox Code Playgroud)

好的,这样就会返回一个响应200

int statusCode = re.getStatusLine().getStatusCode();
Run Code Online (Sandbox Code Playgroud)

但是,服务器上收到的数据无法解析为JSON字符串.我认为格式错误(这是我第一次使用JSON):

如果在php文件中我在$ _POST ['vehicle']上做了回音,我会得到以下结果:

{\"date\":\"today\",\"engineer\":\"me\"}
Run Code Online (Sandbox Code Playgroud)

任何人都可以告诉我哪里出错了,或者是否有更好的方法来实现我想做的事情?希望以上是有道理的!

Sco*_*ler 11

经过大量的阅读和搜索,我发现了问题,我相信在服务器上启用了magic_quotes_gpc.

因此,使用:

json_decode(stripslashes($_POST['vehicle']));
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,删除了斜杠并允许正确解码JSON.

仍不确定为什么发送StringEntity会导致403错误?