Android Volley:POST请求-NodeJS REST API内的req.body为空 [英] Android Volley: POST request - req.body inside of NodeJS REST API empty

查看:93
本文介绍了Android Volley:POST请求-NodeJS REST API内的req.body为空的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我知道已经讨论了十亿次,并且我已经阅读了几个问题/答案,尤其是一个很好的例子->

谢谢!

我终于明白了.我继续寻找答案,偶然发现了这个问题/答案链接./p>

由于我的REST API正在寻找req.body变量,因此getParams()无效.为了发送req.body变量,必须重写getBody()方法.

所以我基本上要做的是:

1)创建一个JSONObject

2)将我的key:values放入JSONObject

3)通过toString()

将我的JSONObject的内容转换为字符串

4)@Override我的JsonObjectRequest中的getBody()方法

完成.

所以我的更正代码如下:

    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的原始问题和编辑"表示敬意,最终该答案将变成什么!

I know its been discussed like a billion times, and I have read a couple of questions/answers and this one in particular seemed like a good example -> example. So now I have tried to recreate the code and added my getParams() as well as my getHeaders(). Awkwardly I get a HTTP Status Code 400:

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

Since I have created the REST API I can see where this status code 400 comes from, its my NodeJS response if the req.body doesn't contain mAtt, mDatum, mRID, mVon. So now I know that my POST request is not properly working even tho I set my getParams()as well as my getHeaders() ...

Now, my guess would be that I'm setting Params but I'm fetching req.body.mAtt, req.body.mDatum , req.body.mRID, req.body.mVon, that would explain why my NodeJS returns the status code 400. If I fetched req.query.mAtt I would probably get something back?

Is there a certain method that need to be overridden by me, to actually set the body instead of the query params?

This is what my POST req looks like:

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

Thank you!

解决方案

I finally got it. I continued to search for answers and stumbled upon this question/answer link.

Since my REST API is looking for req.body variables, the getParams() have no effect. In order to send req.body variables the getBody() method has to be overridden.

So what I basically had to do was:

1) create a JSONObject

2) put my key:values inside the JSONObject

3) get the contents of my JSONObject into a String via toString()

4) @Override the getBody() method inside my JsonObjectRequest

Done.

So my corrected code looks like this:

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

Kudos to @dvdciri for his original question and Edits, what would eventually become this answer!

这篇关于Android Volley:POST请求-NodeJS REST API内的req.body为空的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆