【问题标题】:PHP is not receieving data from a POST request with AsyncTaskPHP 没有从带有 AsyncTask 的 POST 请求中接收数据
【发布时间】:2020-02-02 18:15:16
【问题描述】:

我正在尝试通过在 Android Studio 中使用 POST 请求从我的 PHP 脚本中接收一个简单的字符串。 例如,如果我写 echo "Hello";我可以在我的应用程序中收到此消息,但似乎只要我发送一个 POST 请求,我的网络服务器并没有真正收到该消息。

这是我在 AsyncTask 中执行 POST 请求的方式:

class HTTPReqTask extends AsyncTask<String, Void, String>
{
    Activity activity;
    OnDataSendToActivity dataSendToActivity;
    Context context;

    public HTTPReqTask(Context context)
    {
        this.context = context;
        dataSendToActivity = (OnDataSendToActivity) ((Activity) context);
    }

    @Override
    public String doInBackground(String... params)
    {
        HttpURLConnection urlConnection = null;
        String param1 = params[0];
        String line = "";
        String result = "";

        try
        {
            JsonObject postData = new JsonObject();
            postData.addProperty("a", "1");

            URL url = new URL(param1);
            urlConnection = (HttpURLConnection) url.openConnection();
            urlConnection.setRequestProperty("Content-Type", "application/json");
            urlConnection.setRequestMethod("POST");
            urlConnection.setDoOutput(true);
            urlConnection.setDoInput(true);
            urlConnection.setChunkedStreamingMode(0);

            OutputStream out = new BufferedOutputStream(urlConnection.getOutputStream());
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out,"UTF-8"));
            writer.write(postData.toString());

            int code = urlConnection.getResponseCode();
            if (code !=  HttpURLConnection.HTTP_OK) {
                throw new IOException("Invalid response from server: " + code);
            }

            BufferedReader rd = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));

            while ((line = rd.readLine()) != null)
            {
                result += line;
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        finally
        {
            if (urlConnection != null)
            {
                urlConnection.disconnect();
            }
        }

        return result;
    }

    @Override
    protected void onPostExecute(String s)
    {
        try
        {
            if(dataSendToActivity != null)
            {
                Log.i("Data", s);
                dataSendToActivity.sendData(s);
            }
        }
        catch(Exception e)
        {
            // Nichts
        }

    }
}

如你所见,我正在使用这个:

JsonObject postData = new JsonObject();
postData.addProperty("a", "1");

生成我的 POST 请求。

postData 字符串为:{"a":"1"}

这是我的 PHP 脚本:

$post = file_get_contents("php://input");
$data = json_decode($post, true);

print_r($data);

更新 1

我现在添加了 writer.flush(); (感谢安迪) 现在我在发送请求后收到此异常:

java.io.IOException: Invalid response from server: 500

所以我的 PHP 脚本有问题。

有什么建议吗?

【问题讨论】:

  • 你希望我们猜到print_r 输出什么?
  • u_mulder 你好,print_r 是空的。那就是问题所在。 PHP 没有从 POST 请求中接收任何内容。 Andy 我现在添加了它,但由于某种原因它不执行 onPostExecute 方法。我写了一个“Log(...)”来在我的方法中检查它,当我添加 writer.flush(); 时我没有从 Log 中得到输出;
  • 感谢您的建议。我会保留它并尝试弄清楚为什么我的 onPostExecute 不起作用。

标签: java php android


【解决方案1】:

我现在发现了问题。 问题没有像我预期的那样出现在服务器端。

我在我的代码中记录了一些关于 POST 请求的信息,然后我发现了这个:

Log.i("LOG", urlConnection.getOutputStream().toString());

给了我这个:

buffer(com.android.okhttp.internal.http.HttpConnection$ChunkedSink@843d1c8).outputStream()

所以我把这行注释掉了:

urlConnection.setChunkedStreamingMode(0);

而且效果很好。我得到了我需要的所有数据。

我还将我的 PHP 脚本更新为:

$post = file_get_contents("php://input");

if (!empty($post))
{
    $data = json_decode($post, true);
    $a = $data['a'];
}

感谢大家的帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-11
    • 2018-05-07
    • 2018-08-13
    相关资源
    最近更新 更多