HTTP-запрос POST отправляет JsonObject с помощью Volley - PullRequest
0 голосов
/ 04 октября 2018

Я пытаюсь сделать HTTP-запрос POST через библиотеку Volley на Android.

На самом деле я хотел бы получить объект JSON, возвращенный мне API.

Документация API дает мне этот запрос curl, который работает:

curl -H "Authorization: Token $API_KEY" \
    --header "Content-Type: application/json" \
    --compressed \
    --data @- \
    https://api.idbus.com/v1/search <<JSON
      {
        "origin_id": 1,
        "destination_id": 17,
        "date": "2015-08-15",
        "passengers": [
          { "id": 1, "age": 30 },
          { "id": 2, "age": 30 },
          { "id": 3, "age": 1 }
        ]
      }
JSON

Но я хотел бы преобразовать его в HTTP-запрос с помощью Volley.

Проблема заключается в том, что при запуске моего кода я получаю ошибку 404 во время работы запроса curl.

Мне кажется, проблема в том, как я передаю объект JSON в запрос.Но я не вижу ошибки, надеюсь, кто-то может мне помочь, заранее спасибо!

Вот мой код:

    String url = "https://api.idbus.com/v1/search";
    final JSONObject jsonBody = new JSONObject();
    JSONArray passengers = new JSONArray();

    try {
        passengers.put(getPerson(1, 30));
        passengers.put(getPerson(2, 30));
        passengers.put(getPerson(3, 1));
    } catch (JSONException e){
        e.printStackTrace();
    }
    try {
        jsonBody.put("origin_id", 1);
        jsonBody.put("destination_id", 17);
        jsonBody.put("date", "2015-08-15");
        jsonBody.put("passengers", passengers);
    } catch (JSONException e){
        e.printStackTrace();
    }

    JsonObjectRequest stringRequest = new JsonObjectRequest(Request.Method.POST, url, jsonBody,
            new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    mTextView.setText(response.toString());
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            mTextView.setText("That didn't work!");
        }
    }){
        @Override
        public Map<String, String> getHeaders() throws AuthFailureError {
            Map<String,String> params = new HashMap<String, String>();
            params.put("Authorization", "Token EnVo01jqN2XJIAd8vlLkw");
            params.put("Content-Type","application/json");
            return params;
        }
    };
    queue.add(stringRequest);
}
JSONObject  getPerson(int id, int age) throws JSONException {
    JSONObject person = new JSONObject();
    person.put("id", id);
    person.put("age", age);
    return person;
}

Мой объект Json выглядит так:

    {  
       "origin_id":1,
       "destination_id":17,
       "date":"2015-08-15",
       "passengers":[  
          {  
             "id":1,
             "age":30
          },
          {  
             "id":2,
             "age":30
          },
          {  
             "id":3,
             "age":1
          }
       ]
    }

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Попробуйте потерять final из jsonBody JSONObject

РЕДАКТИРОВАТЬ:

Вы отправляете значения int в виде строк, так что сервер на другой стороне можетне будь так рад этому: то, что ты отправляешь:

 {"origin_id":"1",
"destination_id":"17",
"date":"2015-08-15",
"passengers":[{"id":"1","age":"30"},{"id":"2","age":"30"},{"id":"3","age":"1"}]}

Ты должен отправить:

{"origin_id":1,
"destination_id":17,
"date":"2015-08-15",
"passengers":[{"id":1,"age":30},{"id":2,"age":30},{"id":3,"age":1}]}

Использование:

try {
            passengers.put(getPerson(1, 30));
            passengers.put(getPerson(2, 30));
            passengers.put(getPerson(3, 1));
        } catch (JSONException e){
            e.printStackTrace();
        }
        try {
            jsonBody.put("origin_id", 1);
            jsonBody.put("destination_id", 17);
            jsonBody.put("date", "2015-08-15");
            jsonBody.put("passengers", passengers);
        } catch (JSONException e){
            e.printStackTrace();
        }

И getPerson сейчас следуетвыглядят как int вместо String для id и age:

JSONObject getPerson(int id, int age) throws JSONException

РЕДАКТИРОВАТЬ 2 - Что сработало

хмм, попробуйте использоватьпочтальон (getpostman.com) и отправьте тот же POST оттуда, чтобы увидеть, какую ошибку вы видите, может быть проблема на стороне сервера

0 голосов
/ 04 октября 2018
params.put("Authorization", "Token EnVo01jqN2XJIAd8vlLkw");

Удалить текст Token:

params.put("Authorization", "EnVo01jqN2XJIAd8vlLkw");
...