2016-09-25 8 views
0

Ich versuche, einen POST-Aufruf auf einem Endpunkt für ein Haustier-Projekt von meiner Android App.Android Volley POST ServerError

Ich verwende volley Bibliothek und ich schlage diesen Fehler: com.android.volley.ServerError mit message als NULL. (Ich habe eine harte Zeit, um herauszufinden, was mache ich falsch)

ich sichergestellt habe ich Internet-Verbindung Option in meinem Manifest gegeben haben: <uses-permission android:name="android.permission.INTERNET" />

Auch mein Endpunkt ist über curl für die Prüfung:

curl -X POST -H "Content-Type: application/json" -H "Cache-Control: no-cache" -H "Postman-Token: 122eedf5-8ca5-c1a6-06d9-5cc1986d2b23" -d '{ 
    "departure_time" : "2016-07-21 07:00:00", 
    "arrival_time" : "2016-07-21 08:30:00", 
    "location_flow": ["Milpitas+ca", "SanCarlos+Ca"], 
    "buffer_time": [0, 30, 0], 
    "mode": "driving" 
}' "https://sudtrafficalarm.herokuapp.com/v1/wakecheck" 

Ausgang:

{ 
    "estimated_arrival_time": "2016-07-21 08:05:01", 
    "journey_duration": 2101, 
    "wake_status": false 
} 

Das ist meine Haupttätigkeit:

package com.sudhishkr.sudtrafficalarmandroid; 

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.Toast; 

import com.android.volley.AuthFailureError; 
import com.android.volley.Request; 
import com.android.volley.RequestQueue; 
import com.android.volley.Response; 
import com.android.volley.VolleyError; 
import com.android.volley.toolbox.JsonObjectRequest; 
import com.android.volley.toolbox.StringRequest; 
import com.android.volley.toolbox.Volley; 

import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import java.util.HashMap; 
import java.util.Map; 

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     final RequestQueue queue = Volley.newRequestQueue(this); 
     Button button = (Button) findViewById(R.id.button); 

     button.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       //Toast.makeText(MainActivity.this, SystemTime.date2String(SystemTime.getCurrentTime()), Toast.LENGTH_SHORT).show(); 
       final String REGISTER_URL = "https://sudtrafficalarm.herokuapp.com/v1/wakecheck"; 
       JsonObjectRequest jsonRequest = new JsonObjectRequest(Request.Method.POST, REGISTER_URL, getJsonData(), 
         new Response.Listener<JSONObject>() { 
          @Override 
          public void onResponse(JSONObject response) { 
           Toast.makeText(MainActivity.this, response.toString(), Toast.LENGTH_SHORT).show(); 
          } 
         }, 
         new Response.ErrorListener() { 
          @Override 
          public void onErrorResponse(VolleyError error) { 
           Toast.makeText(MainActivity.this, error.toString(), Toast.LENGTH_SHORT).show(); 
          } 
         } 
       ); 
       queue.add(jsonRequest); 


      } 
     }); 
    } 

    public JSONObject getJsonData() { 
     JSONObject params = new JSONObject(); 
     try { 
      params.put("departure_time", "2016-07-21 07:00:00"); 
      params.put("arrival_time", "2016-07-21 08:30:00"); 
      params.put("mode", "driving"); 
      JSONArray address = new JSONArray(); 
      address.put("Milpitas+ca"); 
      address.put("SanCarlos+Ca"); 
      params.put("location_flow", address); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
     return params; 
    } 


} 

Debugging der Code - bringt mich hier. Und ich habe keine Nachricht oder Information darüber, warum dies geschieht.

enter image description here

+0

ich denke, es sollte eine Verbindung Problem sein, überprüfen Sie bitte Ihre URL arbeitet –

+0

curl ist @JithinKuriakose arbeiten, deshalb gab ich meinen Endpunkt. – sudhishkr

Antwort

1

Sie haben nicht 'buffer_time' Parameter in Ihrem Android-Code hinzugefügt. Siehe die Curl-Anforderung, POST-Daten unterscheiden sich von denen, die Sie von Android-Code senden. Ihre getJsonData() wie folgt aussehen sollte (ich ein Demo-Projekt erstellt und Änderungen, kann ich die erwartete Antwort sehen):

public JSONObject getJsonData() { 
    JSONObject params = new JSONObject(); 
    try { 
     params.put("departure_time", "2016-07-21 07:00:00"); 
     params.put("arrival_time", "2016-07-21 08:30:00"); 
     params.put("mode", "driving"); 
     JSONArray address = new JSONArray(); 
     address.put("Milpitas+ca"); 
     address.put("SanCarlos+Ca"); 
     params.put("location_flow", address); 

     JSONArray buffer_time = new JSONArray(); 
     buffer_time.put(0); 
     buffer_time.put(30); 
     buffer_time.put(0); 
     params.put("buffer_time", buffer_time); 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 
    return params; 
} 
1

Ich denke, es ist passiert, weil Sie versuchen, Toast im Hintergrund-Thread zu drucken, die in Hauptthread genannt nehme an bekommt. Der mögliche Grund könnte sein, dass die Callback-Methoden der API im Hintergrundthread aufgerufen werden, da die Netzwerkoperationen immer im Hintergrundthread stattfinden.

verwenden aktualisierte Code

button.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      //Toast.makeText(MainActivity.this, SystemTime.date2String(SystemTime.getCurrentTime()), Toast.LENGTH_SHORT).show(); 
      final String REGISTER_URL = "https://sudtrafficalarm.herokuapp.com/v1/wakecheck"; 
      JsonObjectRequest jsonRequest = new JsonObjectRequest(Request.Method.POST, REGISTER_URL, getJsonData(), 
        new Response.Listener<JSONObject>() { 
         @Override 
         public void onResponse(JSONObject response) { 
          runOnUiThread(new Runnable() { 
           @Override 
           public void run() { 
            Toast.makeText(MainActivity.this, response.toString(), Toast.LENGTH_SHORT).show();   
           } 
          }); 

         } 
        }, 
        new Response.ErrorListener() { 
         @Override 
         public void onErrorResponse(VolleyError error) { 
          runOnUiThread(new Runnable() { 
           @Override 
           public void run() { 
            Toast.makeText(MainActivity.this, error.toString(), Toast.LENGTH_SHORT).show();   
           } 
          }); 

         } 
        } 
      ); 
      queue.add(jsonRequest); 


     } 
    }); 
+0

eigentlich war es ein Problem mit meiner Nutzlast, die einen Parameter fehlte. – sudhishkr