Tôi hiện đang cố gắng gửi một số dữ liệu từ và ứng dụng Android đến máy chủ php (cả hai đều được kiểm soát bởi tôi).Android JSON HttpClient để gửi dữ liệu đến máy chủ PHP với HttpResponse
Có rất nhiều dữ liệu được thu thập trên biểu mẫu trong ứng dụng, điều này được ghi vào cơ sở dữ liệu. Điều này tất cả các công trình.
Trong mã chính của tôi, trước hết tôi tạo ra một JSONObject (Tôi đã cắt nó xuống đây cho ví dụ này):
JSONObject j = new JSONObject();
j.put("engineer", "me");
j.put("date", "today");
j.put("fuel", "full");
j.put("car", "mine");
j.put("distance", "miles");
Tiếp theo tôi vượt qua các đối tượng trên để gửi và nhận được phản hồi:
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();
}
lớp 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;
}
này nhận được một câu trả lời, nhưng máy chủ trả lại một 40 3 - Phản ứng bị cấm.
Tôi đã thử thay đổi hàm doPost một chút (điều này thực sự tốt hơn một chút), vì tôi đã gửi rất nhiều, về cơ bản 3 của cùng một biểu mẫu với dữ liệu khác nhau - vì vậy tôi tạo 3 JSONObject, một cho mỗi biểu mẫu mục nhập - các mục đến từ DB thay vì ví dụ tĩnh tôi đang sử dụng).
Thứ nhất tôi đã thay đổi các cuộc gọi qua một chút:
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();
}
Ok vì vậy các thay đổi đối với chức năng 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;
}
Ok Vì vậy, đây trả về một phản ứng 200
int statusCode = re.getStatusLine().getStatusCode();
Tuy nhiên, dữ liệu nhận được trên máy chủ không thể được phân tích cú pháp thành chuỗi JSON. Nó được đúng định dạng Tôi nghĩ rằng (đây là lần đầu tiên tôi đã sử dụng JSON):
Nếu trong file php Tôi làm một tiếng vang trên $ _POST [ 'xe'] Tôi nhận được như sau:
{\"date\":\"today\",\"engineer\":\"me\"}
Bất cứ ai có thể cho tôi biết tôi đang đi sai ở đâu, hoặc nếu có cách nào tốt hơn để đạt được những gì tôi đang cố gắng làm? Hy vọng rằng ở trên có ý nghĩa!
Cảm ơn bạn đã dành thời gian ghi lại sự cố của bạn với phản hồi 403. Đã có điều tương tự trong một tuần và bài đăng của bạn cuối cùng đã giúp tôi di chuyển đúng hướng! –
@Toran Billups không phải là một vấn đề, tôi vui vì nó đã giúp bạn !! – Scoobler
Các biến của bạn đăng lên tập lệnh PHP chính xác. Làm thế nào bạn sẽ kéo từng biến nói "kỹ sư" và "nhiên liệu" và chèn chúng vào cơ sở dữ liệu MySQL chẳng hạn. Có vẻ như tất cả những gì bạn có thể làm chỉ là sử dụng biến '$ _POST ['vehicle'];'. Sẽ rất hoan nghênh một phản ứng với điều này. – WebDevDanno