2010-03-29 30 views
23

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!

+0

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! –

+0

@Toran Billups không phải là một vấn đề, tôi vui vì nó đã giúp bạn !! – Scoobler

+0

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

Trả lời

11

Sau nhiều lần đọc và tìm kiếm tôi đã tìm thấy sự cố phải có, tôi tin rằng magic_quotes_gpc đang được bật trên máy chủ.

Vì vậy, sử dụng:

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

Trong ví dụ của tôi ở trên loại bỏ các dấu gạch chéo và cho phép người JSON để được giải mã đúng.

Vẫn không chắc tại sao gửi StringEntity lại gây ra lỗi 403?

+0

ya đúng vậy! : D – gumuruh

+1

Bạn có thể chia sẻ tệp PHP chứa 'json_decode' vì tôi nghĩ máy chủ của tôi đang giải mã dữ liệu json (sai) có thể liên quan đến bạn hay không. – WebDevDanno

+0

json_decode (stripslashes ($ _ POST ['xe']), đúng); sẽ trả về mảng php, json_decode (stripslashes ($ _ POST ['xe'])); trả về php stdclass obj, rất khó sử dụng. 1 cho câu trả lời đúng, thx –

0

Thay đổi

(String url = "http://www.server.com/MainPage.php";) 

để

(String url = "http://www.server.com/MainPage.php?";) 

Câu hỏi đánh dấu ở cuối là cần thiết khi bạn đang cố gắng để gửi các thông số để php script.

+3

Cảm ơn Sergey, nhưng tôi đang sử dụng một phương thức POST để gửi dữ liệu, không chuyển các tham số cho GET từ tập lệnh PHP. – Scoobler

4
StringEntity s = new StringEntity(c.toString()); 
s.setContentEncoding("UTF-8"); 
s.setContentType("application/json"); 
request.setEntity(s); 
1

Hãy thử mã này nó làm việc cho tôi

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) { 
} 

}

0

Hãy thử mã này nó hoạt động hoàn hảo

*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" 
 
     } 
 
    }

sau đó gọi HttpClient lớp AsyncTask này Như thế này:

lớp tin YourTask kéo dài AsyncTask {private String ERROR_MSG = "! Server lỗi";

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 

    } 
} 
Các vấn đề liên quan