Android JSON HttpClient для отправки данных в сервер PHP с HttpResponse

Я в настоящее время пытаюсь отправить некоторые данные из и приложение 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 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();
}

Хорошо так изменения в функции 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 ['механизм'], я получаю следующее:

{\"date\":\"today\",\"engineer\":\"me\"}

Кто-либо может сказать мне, где я иду не так, как надо, или если существует лучший способ достигнуть того, что я пытаюсь сделать? Надо надеяться, вышеупомянутое имеет смысл!

23
задан Scoobler 6 March 2012 в 14:21
поделиться

1 ответ

После долгих чтений и поисков я обнаружил, что проблема заключается в том, что, как я полагаю, magic_quotes_gpc включен на сервере.

Таким образом, использование:

json_decode(stripslashes($_POST['vehicle']));

В моем примере выше удаляет слеши и позволяет правильно декодировать JSON.

Все еще не понятно, почему отправка StringEntity вызывает ошибку 403?

11
ответ дан 29 November 2019 в 03:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: