2016-01-10 2 views
1

Я знаю, что его обсуждали как миллиард раз, и я прочитал пару вопросов/ответов, и это, в частности, показалось хорошим примером ->example. Итак, теперь я попытался воссоздать код и добавил getParams(), а также мой getHeaders(). Неудачно я получаю HTTP-код состояния 400:Android Volley: POST-запрос - req.body внутри NodeJS REST API пуст

E/Volley: [303] BasicNetwork.performRequest: Unexpected response code 400 for http://10.0.2.2:3000/classes

Поскольку я создал REST API, я могу видеть, где этот код состояния 400 приходит, его ответ мой NodeJS если req.body не содержит mAtt, mDatum, mRID, mVon. Так что теперь я знаю, что мой POST запрос не работает должным образом даже то я поставил свою getParams() как и мои getHeaders() ...

Теперь, мое предположение было бы, что я устанавливаю Params, но я выборки req.body.mAtt, req.body.mDatum , req.body.mRID, req.body.mVon, что объяснит, почему мой NodeJS возвращает код состояния 400. Если бы я выбрал req.query.mAtt, я бы, вероятно, получил что-то?

Есть ли какой-то метод, который должен быть переопределен мной, чтобы фактически установить тело вместо параметров запроса?

Это то, что мой POST REQ выглядит следующим образом:

JsonObjectRequest JOPR = new JsonObjectRequest(Request.Method.POST, 
         myAcitveLessonPOSTUrl, null, new Response.Listener<JSONObject>(){ 
     @Override 
     public void onResponse(JSONObject response) { 
      try { 
       VolleyLog.v("Response:%n %s", response.toString(4)); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
     } 
    }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      VolleyLog.e("Error: ", error.getMessage()); 
     } 
    }){ 
     @Override 
     public Map<String, String> getHeaders() throws AuthFailureError { 
      HashMap<String, String> headers = new HashMap<String, String>(); 
      headers.put("Content-Type", "application/json"); 
      return headers; 
     } 

     @Override 
     protected Map<String, String> getParams() 
     { 
      Map<String, String> params = new HashMap<String, String>(); 
      params.put("mAtt", "+1"); 
      params.put("mDatum", mDatum); 
      params.put("mRID", mRID); 
      params.put("mVon", mVon); 

      return params; 
     } 


    }; 


    requestQ.add(JOPR); 

Спасибо!

+0

Используете ли вы тело JSON для разбора экспресс-промежуточного программного обеспечения (например, 'body-parser')? – mscdex

+0

@mscdex да, я использую Express 4 и 'body-parser' – b101

ответ

1

Я, наконец, получил его. Я продолжал искать ответы и наткнулся на этот вопрос/ответ link.

Поскольку мой REST API ищет переменные req.body, getParams() не действуют. Для того чтобы отправить req.body переменные, метод getBody() должен быть переопределен.

Так что я в основном должен был сделать:

1) создать JSONObject

2) кладу ключ: значение внутри JSONObject

3) получить содержимое моего JSONObject в Строка с помощью toString()

4) @Override метод getBody() внутри моей JsonObjectRequest

Готово.

Так что мой исправленный код выглядит следующим образом:

JSONObject jsonBodyObj = new JSONObject(); 
    try{ 
     jsonBodyObj.put("mAtt", "+1"); 
     jsonBodyObj.put("mDatum",mDatum); 
     jsonBodyObj.put("mRID",mRID); 
     jsonBodyObj.put("mVon",mVon); 
    }catch (JSONException e){ 
     e.printStackTrace(); 
    } 
    final String requestBody = jsonBodyObj.toString(); 

    JsonObjectRequest JOPR = new JsonObjectRequest(Request.Method.POST, 
        myAcitveLessonPOSTUrl, null, new Response.Listener<JSONObject>(){ 
     @Override 
     public void onResponse(JSONObject response) { 
      try { 
       VolleyLog.v("Response:%n %s", response.toString(4)); 
       populateLessonDetails(myActiveLessonURLFiltered); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
     } 
    }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      VolleyLog.e("Error: ", error.getMessage()); 
     } 
    }){ 
     @Override 
     public Map<String, String> getHeaders() throws AuthFailureError { 
      HashMap<String, String> headers = new HashMap<String, String>(); 
      headers.put("Content-Type", "application/json"); 
      return headers; 
     } 


     @Override 
     public byte[] getBody() { 
      try { 
       return requestBody == null ? null : requestBody.getBytes("utf-8"); 
      } catch (UnsupportedEncodingException uee) { 
     VolleyLog.wtf("Unsupported Encoding while trying to get the bytes of %s using %s", 
         requestBody, "utf-8"); 
       return null; 
      } 
     } 


    }; 

    requestQ.add(JOPR); 

Престижность @dvdciri за его оригинальный вопрос и редактирует, что в конечном счете стать этим ответом!

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