2011-06-30 11 views
10

używam następującego kodu, aby wykonać połączenie httpPost, ale zwraca mi ono 400 złych żądań , gdy próbuję podać następujące parametry w "prostym kliencie" w rozszerzeniu chrome to działa dobrze, jeden przewodnik mi co za błąd robię tutaj ?jak wykonać wywołanie httpPost z treścią zakodowaną przez json?

Proste reszta Client wszedłem następujące:

URL: http://jon2012.com/api/register Metoda: POST Nagłówki: Brak nagłówki, ponieważ nie są one wymagane Dane: { "email": "[email protected]" "first_name": "Nazwa"} enter image description here

Code Android:

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"); 
     } 

każda pomoc będzie appriciated

+0

Czy Twój json danych wzór jest taki sam, jak wymagana usługa? –

Odpowiedz

21

Robiłem wspólną sekwencję błędów obiektu JSON było nie tak. na przykład ja wysyłając go jak first_name, email..etc..where jako prawidłowa sekwencja została email, first_name

mój kod

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

Kolejność, w jakiej dodajesz swoje parametry, nie powinna mieć absolutnie żadnej różnicy. Serwer internetowy odbierający parametry nie powinien przejmować się tym, w jakiej kolejności są tylko parametry, że paramy są poprawnie zagnieżdżone, a klucze są poprawnie zdefiniowane. – jamesc

+16

Nie jestem pewien, jak to jest poprawna odpowiedź ... i została ona poddana pod głosowanie przez cztery ludzie. Kolejność parametrów JSON zdecydowanie nie ma znaczenia. –

0

Oto mój kod do wywoływania usług REST z HTTP POST i JSON:

(zauważ, że używam AndroidHttpClient, która w zasadzie DefaultHttpClient z niektórych ustawionych atrybutów i projekt GSON Google dla JSON zestawiania)

klasa do obsługi komunikacji:

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

Zastosowanie:

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(); 

Mam nadzieję, że to pomaga.

+0

Chcę wysłać dwa parametry adresu e-mail i nazwę, czy mógłbyś wskazać mi gdzie z nich korzystać? – UMAR

+0

co to jest Gson? i co to jest Somecontent faktycznie to mylące część – UMAR

+0

SomeContent jest trochę treści :) Niestandardowa klasa, która ma pola zawierające dane, które chcesz wysłać. Gson jest używany do umieszczenia go w json, google up, jest dość przydatny i łatwiejszy w użyciu niż domyślna biblioteka json w sdk z Androidem. –

Powiązane problemy