2017-02-16 14 views
0

Я пытался повторить следующий завиток запроса в Android Studio, используя залп в течение нескольких часов и продолжаю получать ошибки:Отправка JSON словарей в завершающем поле тела с использованием Volley

curl -X POST -H "Authorization: Bearer <access_token> " \ 
    -H "Content-Type: application/json" \ 
    -d '{"ride_type" : "lyft", "origin" : {"lat" : 34.305658, "lng" : -118.8893667 } }' \ 
    'https://api.lyft.com/v1/rides' 

функции вызывается команда:

runPost (lyftCodeURL + "аттракционы");

Следующий мой код волейбола. Это всегда приводит к ответу 400 Server, а ошибка - «com.android.volley.ServerError». Пожалуйста, дайте мне знать, что я делаю неправильно. Спасибо!

private void runPost(String uri) { 
     StringRequest stringRequest = new StringRequest(Request.Method.POST, uri, 
       new Response.Listener<String>() { 
        @Override 
        public void onResponse(String response) { 
         JSONObject obj = null; 
         try { 
          String res = stripHtml(response); 
          obj = new JSONObject(res); 
          tv.setText("res" + res.toString()); 
         } catch (Exception e) { 
          tv2.setText(e.toString()); 
         } 
         if (obj != null) { 
          handleLyftInfos(obj, 1); 
         } 
        } 
       }, 
       new Response.ErrorListener() 
       { 
        @Override 
        public void onErrorResponse(VolleyError error) { 
         tv.setText("err" + error.networkResponse.statusCode + " mfg " + error.toString()); 
        } 
       } 
     ) { 
      @Override 
      protected Map<String, String> getParams() { 
       Map<String, String> params = new HashMap<String, String>(); 
       JSONArray jArrayInput=new JSONArray(); 
       JSONObject originObject = new JSONObject(); 
       try { 
        params.put("ride_type", "lyft"); 
        originObject.put("lat", "34.305658"); 
        originObject.put("lng", "-118.8893667"); 
        params.put("origin", originObject.toString()); 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 
       Log.d("Param:", params.toString()); 
       return params; 
      } 
      @Override 
      public Map<String, String> getHeaders() throws AuthFailureError { 
       Map<String,String> params = new HashMap<String,String>(); 
       params.put("Authorization","Bearer " + aKey); params.put("Content-Type","application/json"); 
       return params; 
      } 
     }; 
     queue.add(stringRequest); 

    } 
+0

Кроме того, я уверен, что ошибка заключается в методе getParams(), где я пытаюсь передать «происхождение». Я не уверен, почему, но лифтовый сервер не распознает способ настройки параметров. –

ответ

0

Посмотрите на JsonObjectRequest.

JSONObject request = new JSONObject(); 
request.put("a","1"); 
request.put("v","33"); 

JsonObjectRequest strReq = new JsonObjectRequest(Request.Method.POST, "<URL>", request, 
     new Response.Listener<JSONObject>() { 

      @Override 

      public void onResponse(JSONObject response) { 
      }, 
     new Response.ErrorListener() { 

      @Override 
      public void onErrorResponse(VolleyError error) { 
      } 
     }); 
+0

Итак, чтобы сделать это с данными, которые мне нужны, мне просто нужно было сделать: 'JSONObject request = new JSONObject(); JSONObject originObject = new JSONObject(); originObject.put ("lat", "34.305658"); originObject.put ("lng", "-118.8893667"); request.put ("ride_type", "lyft"); request.put ("origin", originObject); ' –

+0

Да, JsonObjectRequest хорош для отправки и получения (вы также должны получать приложение/json). Он заботится о типе контента и тесте POST/PUT и т. Д. –

0

Я не уверен, что приведенный выше ответ также работает, но я решил другое решение моей проблемы. Мне пришлось переопределить функции getBody() и getBodyContentType(), а не getParams(), если кто-то еще столкнется с этой проблемой.

Смежные вопросы