2011-06-30 7 views
10

Tôi đang sử dụng mã sau để thực hiện cuộc gọi httpPost nhưng nó trả lại cho tôi 400 yêu cầu xấu khi tôi cố gắng cung cấp thông số sau trong "khách hàng nghỉ ngơi đơn giản" trong tiện ích mở rộng chrome. ?làm thế nào để thực hiện cuộc gọi httpPost với cơ thể mã hóa json?

đơn giản còn lại khách hàng tôi bước vào như sau:

URL: http://jon2012.com/api/register Phương pháp: POST Headers: Không có tiêu đề, vì chúng không cần dữ liệu: { "email": "[email protected]", "first_name": "Tên"} enter image description here

Android Code:

HttpClient client = new DefaultHttpClient(); 
     HttpConnectionParams.setConnectionTimeout(client.getParams(), 10000); //Timeout Limit 
     HttpResponse response; 
     JSONObject json = new JSONObject(); 
     try{ 
      HttpPost post = new HttpPost(url); 
      json.put("email", email); 
      json.put("first_name", name); 
      StringEntity se = new StringEntity("JSON: " + json.toString()); 
      se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json")); 
      post.setEntity(se); 
      response = client.execute(post); 
      /*Checking response */ 
      /*if(response!=null){ 
       InputStream in = response.getEntity().getContent(); //Get the data in the entity 
*/ 
      int statusCode = response.getStatusLine().getStatusCode(); 

     } 
     catch(Exception e){ 
      e.printStackTrace(); 
      // createDialog("Error", "Cannot Estabilish Connection"); 
     } 

bất kỳ trợ giúp sẽ được appriciated

+0

là mô hình dữ liệu json của bạn là giống như yêu cầu dịch vụ? –

Trả lời

21

tôi đã tạo chuỗi lỗi thường gặp về đối tượng json là sai. ví dụ tôi đã gửi nó như first_name, email..etc..where chuỗi như đúng được email, first_name

mã của tôi

boolean result = false; 
     HttpClient hc = new DefaultHttpClient(); 
     String message; 

     HttpPost p = new HttpPost(url); 
     JSONObject object = new JSONObject(); 
     try { 

      object.put("updates", updates); 
      object.put("mobile", mobile); 
      object.put("last_name", lastname); 
      object.put("first_name", firstname); 
      object.put("email", email); 

     } catch (Exception ex) { 

     } 

     try { 
     message = object.toString(); 


     p.setEntity(new StringEntity(message, "UTF8")); 
     p.setHeader("Content-type", "application/json"); 
      HttpResponse resp = hc.execute(p); 
      if (resp != null) { 
       if (resp.getStatusLine().getStatusCode() == 204) 
        result = true; 
      } 

      Log.d("Status line", "" + resp.getStatusLine().getStatusCode()); 
     } catch (Exception e) { 
      e.printStackTrace(); 

     } 

     return result; 
+22

Thứ tự mà bạn thêm thông số của bạn nên hoàn toàn KHÔNG có sự khác biệt nào. Máy chủ web nhận được các tham số KHÔNG nên quan tâm thứ tự các tham số nào chỉ trong các tham số được lồng nhau một cách chính xác và các khóa được xác định chính xác – jamesc

+16

Tôi không chắc đây là câu trả lời đúng ... và nó được bình chọn bởi bốn những người. Thứ tự tham số JSON chắc chắn không quan trọng. –

0

Dưới đây là mã của tôi để gọi các dịch vụ còn lại với Http POST và JSON:

(Lưu ý rằng tôi đang sử dụng AndroidHttpClient, đó là cơ bản một DefaultHttpClient với một số thuộc tính cài sẵn, và dự án GSON của Google cho JSON marshalling)

lớp để xử lý thông tin liên lạc:

public class NetworkComm extends AsyncTask<String, Integer, String> { 

    // Log tag 
    private static final String TAG = "NetworkComm"; 

    private AndroidHttpClient hc; 
    private HttpContext localContext; 
    private TaskResponseListener listener; 
    private int reqType; 
    private String message; 
    private String url; 
    private Object extra; 

    public NetworkComm(AndroidHttpClient hc, HttpContext localContext, TaskResponseListener listener, 
      int reqType, String message, String url, Object extra){ 
     super(); 

     this.hc = hc; 
     this.localContext = localContext; 
     this.listener = listener; 
     this.reqType = reqType; 
     this.message = message; 
     this.url = url; 
     this.extra = extra; 
    } 

    public AndroidHttpClient getHc() { 
     return hc; 
    } 

    public void setHc(AndroidHttpClient hc) { 
     this.hc = hc; 
    } 

    public HttpContext getLocalContext() { 
     return localContext; 
    } 

    public void setLocalContext(HttpContext localContext) { 
     this.localContext = localContext; 
    } 

    public void start(){ 
     this.execute(message); 
    } 

    protected void onPreExecute() { 
     //Don't do anything here 
    } 

    protected String doInBackground(String... req) { 

     Log.d(TAG, "Message to send: "+req[0]); 
     HttpPost p = new HttpPost(url); 

     try{ 
      p.setEntity(new StringEntity(req[0], "UTF8")); 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
     p.setHeader("Content-type", "application/json"); 

     String response = ""; 
     try{ 
      HttpResponse resp = hc.execute(p, localContext); 
      InputStream is = resp.getEntity().getContent(); 
      response = convertStreamToString(is); 
      Log.d("Response", "Response is " + response); 

      Log.d("Status line", ""+resp.getStatusLine().getStatusCode()); 
     } catch (Exception e){ 
      e.printStackTrace(); 
     } 

     return response; 
    } 

    protected void onProgressUpdate(Integer... progress) { 
     // dont handle this yet 
    } 

    @Override 
    protected void onCancelled() { 
     super.onCancelled(); 
    } 

    protected void onPostExecute(String result) { 
     Log.d("task", "task finished"); 
     listener.onTaskResponse(reqType, result, extra); 
    } 

    public interface TaskResponseListener{ 
     public void onTaskResponse(int type, String response, Object extra); 
    } 

    private String convertStreamToString(InputStream is) throws IOException { 
     if (is != null) { 
      Writer writer = new StringWriter(); 

      char[] buffer = new char[1024]; 
      try { 
       Reader reader = new BufferedReader(
         new InputStreamReader(is, "UTF-8")); 
       int n; 
       while ((n = reader.read(buffer)) != -1) { 
        writer.write(buffer, 0, n); 
       } 
      } finally { 
       is.close(); 
      } 
      return writer.toString(); 
     } else {   
      return ""; 
     } 
    } 
} 

Cách sử dụng:

Gson g = new Gson(); 
     SomeContent content = new SomeContent("Stuff", 4); 
     String message = g.toJson(content); 

     NetworkComm task = new NetworkComm(hc, localContext, listener, 0, message, url, ""); 
     task.start(); 

Hy vọng rằng điều này sẽ giúp.

+0

tôi muốn gửi hai thông số email và tên bạn có thể vui lòng hướng dẫn tôi nơi để sử dụng chúng? – UMAR

+0

Gson là gì? và những gì là Somecontent thực sự đây là một phần khó hiểu – UMAR

+0

SomeContent là một số nội dung :) Một lớp tùy chỉnh có các trường có chứa dữ liệu mà bạn muốn gửi. Gson được sử dụng để đặt nó vào json, google nó lên, nó khá tiện dụng và dễ sử dụng hơn so với lib json mặc định trong sdk android. –