【问题标题】:Unable to pass data to a POST request using Volley library - Android无法使用 Volley 库将数据传递给 POST 请求 - Android
【发布时间】:2020-05-17 02:24:59
【问题描述】:

我正在尝试从我的服务器发送 Firebase 推送通知。我通过使用 Volley 发送 POST 请求来触发 .php 文件,如下所示:

public static void dataPacket(Activity activity, Map<String, String> bundle)
    {
        new AsyncTask<String, Boolean, Boolean>()
        {
            protected Boolean doInBackground(String... params)
            {
                String url  = CloudData.TEST_DATA_PACKET;
                RequestQueue queue = Volley.newRequestQueue(activity);

                StringRequest postRequest = new StringRequest(Request.Method.POST, url,
                        response -> {
                            // response
                            Log.d("Response", response);
                        },
                        error -> {
                            error.printStackTrace();
                            Log.d("Error.Response", error.toString());
                        }
                ) {
                    @Override
                    protected Map<String, String> getParams()
                    {
                        return bundle;
                    }

                    @Override
                    public Map<String, String> getHeaders()
                    {
                        Map<String, String>  headerParams = new HashMap<>();
                        headerParams.put("Content-Type", "application/json; charset=utf-8");

                        return headerParams;
                    }//*/
                };

                postRequest.setRetryPolicy(new DefaultRetryPolicy(
                        10000,
                        0,
                        DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));//*/

                queue.add(postRequest);
                return true;
            }
        }.execute();
    }

这是我服务器中的 .php 文件:

<?php
    require 'FCMPushNotification.php'; 

    $FCMPushNotification = new \BD\FCMPushNotification('MY_API_KEY');

    $sDeviceToken = $_POST['token'];

    $aPayload = array(
        'data' => array("test"=>123),
        'notification' => array(
            'title' => 'Example app',
            'body'=> 'This is an example message',
            'sound'=> 'default'
        )
    );

    $aOptions = array(
        'time_to_live' => 0 //means messages that can't be delivered immediately are discarded. 
    );

    $aResult = $FCMPushNotification->sendToDevice(
        $sDeviceToken,      
        $aPayload,
        $aOptions // optional
    );

    var_dump($aResult);  

 ?>

当我改变这一行时

$sDeviceToken = $_POST['token'];

到这里

$sDeviceToken = 'my_firebase_token_for_a_device';

一切正常。但是当我尝试从 POST 请求中获取变量 'token' 时,android 给了我这个错误:

BasicNetwork.performRequest:意外响应代码 500 https://mywebsite.com/sendnotification.php W/System.err: com.android.volley.ServerError W/System.err:在 com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:179) W / System.err:在 com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:114) D/Error.Response: com.android.volley.ServerError

我做错了什么?

更新

这就是我调用dataPacket的方式:

PostTaskListener<String> postTaskListener = result ->
        {
            bundle.put("token",result); 
            SendNotification.dataPacket(activity,bundle);
        };
        FirebaseCloud.getFirebaseToken(db.getActiveProfile().cID,postTaskListener,activity);

【问题讨论】:

  • 那么 POST 请求的主体在哪里,前面提到的数组包含“令牌”值?
  • 我尝试传递另一个 POST 变量并将该变量作为推送通知的标题。通知带有空标题。
  • 你指定body格式为application/json,并以数组(form-data)的形式传入,可能会影响结果。
  • @DanielProtopopov 你是对的,这就是问题所在。如果您想正确回答问题,以便我接受答案。
  • @DanielProtopopov 顺便说一句,我应该把什么作为内容类型?

标签: php android http-post android-volley


【解决方案1】:

您将正文格式指定为 application/json,并以数组(表单数据)的形式传递,这可能会影响结果。格式应为 multipart/form-data(或 application/x-www-form-urlencoded,根据 wiki)。

【讨论】:

  • 我应该把什么作为内容类型?
猜你喜欢
  • 1970-01-01
  • 2015-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-24
  • 1970-01-01
  • 1970-01-01
  • 2021-03-11
相关资源
最近更新 更多