首页 > 解决方案 > 编辑:如何发送带有参数和表单数据的帖子请求,如 JAVA 中的邮递员截图?

问题描述

邮递员截图

我正在尝试发送一个 POST 请求来获取评论,但它在 Java 中不起作用,而它与邮递员一起使用。

我收到一个 403 Forbidden 错误,但在邮递员上它检索到我需要的数据就好了..

这是我试图用来复制行为的 Java 代码。

String targetUrl = YOUTBE_COMMENTS_AJAX_URL;
    String urlParameters = "action_load_comments=1&order_by_time=True&filter=jBjXVrS8nXs";
    String updatedURL = targetUrl + "?" + urlParameters;
    URL url = null;
    InputStream stream = null;
    HttpURLConnection urlConnection = null;
    try {
        url = new URL(updatedURL);
        urlConnection = (HttpURLConnection) url.openConnection();
        urlConnection.setRequestMethod("POST");
        urlConnection.setRequestProperty("content-type", "multipart/form-data");
        urlConnection.setRequestProperty("user-agent", "USER_AGENT");
        urlConnection.setDoOutput(true);

        String data = URLEncoder.encode("video_id", "UTF-8")
                + "=" + URLEncoder.encode(youtubeId, "UTF-8");

        data += "&" + URLEncoder.encode("session_token", "UTF-8") + "="
                + URLEncoder.encode(xsrfToken, "UTF-8");

        data += "&" + URLEncoder.encode("page_token", "UTF-8") + "="
                + URLEncoder.encode(pageToken, "UTF-8");
        urlConnection.connect();

        OutputStreamWriter wr = new OutputStreamWriter(urlConnection.getOutputStream());
        wr.write(data);
        wr.flush();

        stream = urlConnection.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(stream, "UTF-8"), 8);
        String result = reader.readLine();
        return result;

    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (urlConnection != null) {
            urlConnection.disconnect();
        }
    }

    try {
        Thread.sleep(2000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return null;

这是邮递员在其标头中发送的示例

标签: javarestpostrequest

解决方案


似乎您的问题就在这里(请参阅内联评论):

DataOutputStream wr = new DataOutputStream(conn.getOutputStream());
wr.writeBytes(urlParameters); 
// you wrote your URL parameters into Body
wr.flush();
wr.close(); 
//You closed your body and told server - you are done with request
conn.getOutputStream().write(postDataBytes); 
// you wrote data into closed stream - server does not care about it anymore. 
  • urlParameters打开 URL 时,您必须将其直接附加到 URL
  • 然后你必须像你一样将你的表单数据写入正文: conn.getOutputStream().write(postDataBytes);
  • 然后关闭输出流

推荐阅读