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, по одному для каждой записи формы - записи поступают из БД вместо статического примера, который я использую).
Во-первых, я немного изменил вызов:
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();
}
Хорошо, итак, изменения в допосте функция:
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\"}
Может ли кто-нибудь сказать мне, где я ошибаюсь, или есть ли лучший способ достичь того, что я пытаюсь сделать? Надеюсь, вышесказанное имеет смысл!
5 answers
После долгого чтения и поиска я обнаружил, что проблема в том, что я верю, что magic_quotes_gpc включен на сервере.
Таким образом, используя:
json_decode(stripslashes($_POST['vehicle']));
В моем примере выше удаляет косые черты и позволяет правильно декодировать JSON.
Все еще не уверен, почему отправка строки вызывает ошибку 403?
StringEntity s = new StringEntity(c.toString());
s.setContentEncoding("UTF-8");
s.setContentType("application/json");
request.setEntity(s);
Попробуйте этот код, он работает для меня
public void postData(String result,JSONObject obj) {
// Create a new HttpClient and Post Header
HttpClient httpclient = new DefaultHttpClient();
HttpParams myParams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(myParams, 10000);
HttpConnectionParams.setSoTimeout(myParams, 10000);
String json=obj.toString();
try {
HttpPost httppost = new HttpPost(result.toString());
httppost.setHeader("Content-type", "application/json");
StringEntity se = new StringEntity(obj.toString());
se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
httppost.setEntity(se);
HttpResponse response = httpclient.execute(httppost);
String temp = EntityUtils.toString(response.getEntity());
Log.i("tag", temp);
} catch (ClientProtocolException e) {
} catch (IOException e) {
}
}
Изменение
(String url = "http://www.server.com/MainPage.php";)
До
(String url = "http://www.server.com/MainPage.php?";)
Знак вопроса в конце необходим, когда вы пытаетесь отправить параметры в php-скрипт.
Попробуйте этот код, он отлично работает
*For HttpClient class* download jar file "httpclient-4.3.6.jar" and put in libs folder then
Compile: dependencies {compile files('libs/httpclient-4.3.6.jar')}
repositories {
maven {
url "https://jitpack.io"
}
}
затем вызовите класс HttpClient этой AsyncTask Следующим образом:
Частный класс Yourtask расширяет AsyncTask{ частная строка error_msg = "Ошибка сервера!";
private JSONObject response;
@Override
protected Boolean doInBackground(String... params) {
try {
JSONObject mJsonObject = new JSONObject();
mJsonObject.put("user_id", "user name");
mJsonObject.put("password", "123456");
String URL=" Your Link"
//Log.e("Send Obj:", mJsonObject.toString());
response = HttpClient.SendHttpPost(URL, mJsonObject);
boolean status = response != null && response.getInt("is_error") == 0; // response
return status;
} catch (JSONException | NullPointerException e) {
e.printStackTrace();
mDialog.dismiss();
return false;
}
}
@Override
protected void onPostExecute(Boolean status) {
// your code
}
}