RetroFit无法发送POST请求

时间:2019-12-12 16:27:34

标签: android http retrofit

我一直在尝试向php脚本发送POST请求,以更新MySQL数据库中表的值。我最近一直在使用RetroFit,并已使用它为基于POST的操作发送了很多POST请求。我不知道是否会出现问题,因为我违反了HTTP最佳做法,该做法建议使用PUT进行更新操作,但我也尝试从客户端发送PUT请求,尽管结果相同。当我检查它们时,数据库值未更改。这是我从RetroFit发送HTTP发布请求的代码。

                    final JsonDataAPI API = RetroFitClient.getInstance().getAPI();
                    Map<String, String> voteParams = new HashMap<String, String>();
                    voteParams.put("pollID", String.valueOf(pollID));
                    voteParams.put("optText", rb1.getTag().toString());
                    Call <ArrayList<PollOpt>> voteCall = API.makeVote(voteParams);
                        voteCall.enqueue(new Callback<ArrayList<PollOpt>>() {
                            @Override
                            public void onResponse(Call<ArrayList<PollOpt>> call, Response<ArrayList<PollOpt>> response) {
                                if(!response.isSuccessful()){
                                    Toast.makeText(PollPage.this, "Vote Unsuccessful for vote 2", 
                                   Toast.LENGTH_SHORT).show();
                                }   else{
                                    Toast.makeText(PollPage.this, "Vote Successful for vote 2", 
                                  Toast.LENGTH_SHORT).show();
                                }
                            }

                            @Override
                            public void onFailure(Call<ArrayList<PollOpt>> call, Throwable t) {
                                Log.d("TAG", "Vote Failure: " + t.getMessage());
                                Log.d("TAG", "FailureURL rb2: " + call.request().url().toString());
                            }
                        });

请求的URL很好,它甚至在onFailure函数中打印该请求,该函数在没有响应的情况下会触发,尽管我不希望响应。

这也是请求也被发送的PHP API代码的一部分 Vote.php

'

    method = $_SERVER['REQUEST_METHOD'];

    switch($method){

    case "POST":

    if(isset($_POST["optText"]) && isset($_POST["pollID"])){

        $optText = $_POST["optText"];
        $pollID = (int) $_POST["pollID"];

        $query = "UPDATE polloption SET frequency = frequency + 1 WHERE pollID = " . $pollID . " AND optText = '". $optText ."'";

        $conn = new mysqli($host, $user, $pass, $database);
    if ($conn->connect_error)
        die($conn->connect_error); 

        if(mysqli_query($conn, $query)){
            echo "Updated Poll Frequency";
        } else{
            echo "Failed to Update Poll Frequency";            
        }



    }

    break;'

我已经使用AJAX脚本测试了PHP代码,发现您可以在AJAX请求响应中看到phps回显数据,而在Android中,当您使用GET以外的方法发送HTTP请求并确定错误而又没有错误时,您基本上处于黑暗中必须使用AJAX请求单独测试每个文件。在使用具有不同参数的AJAX脚本多次测试服务器后,我看不到为什么通过RetroFit发送POST请求时频率值没有更新。

任何对此的建议将不胜感激!

1 个答案:

答案 0 :(得分:0)

不要使用 isset($_POST["optText"]) && isset($_POST["pollID"]) 从基于 Json 的 body 请求中获取值,只需使用

$post_body = file_get_contents('php://input');

对于 php