编辑:如何使用参数和表单数据发送此post请求,如JAVA中的postman屏幕截图?

编辑:如何使用参数和表单数据发送此post请求,如JAVA中的postman屏幕截图?,java,rest,post,request,Java,Rest,Post,Request,我试图发送一个POST请求来获取评论,但它在Java中不起作用,而在postman中起作用 我得到了一个403禁止的错误,但在《邮差》上它检索到了我需要的数据 下面是我试图用来复制行为的Java代码 String targetUrl = YOUTBE_COMMENTS_AJAX_URL; String urlParameters = "action_load_comments=1&order_by_time=True&filter=jBjXVrS8nXs"; St

我试图发送一个POST请求来获取评论,但它在Java中不起作用,而在postman中起作用

我得到了一个403禁止的错误,但在《邮差》上它检索到了我需要的数据

下面是我试图用来复制行为的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;

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

  • 打开URL时,必须将
    urlParameters
    直接附加到URL
  • 然后,您必须像这样将表单数据写入正文:
    conn.getOutputStream().write(postDataBytes)
  • 然后关闭输出流

看起来您没有像邮递员请求那样发送邮件头。可能与的重复,但我在执行setRequestProperty时是否设置了邮件头?这是我在PostAnalyRight中设置的唯一2个,所以我完全按照您在编辑的代码中所说的做了,但是现在我得到的错误是403“禁止”,而不是400。所以我猜它至少被发送了,但我想编码不正确?Idk,如果这有帮助的话,但是当我尝试通过postman原始发送它时,我得到了相同的结果,但是通过postman的表单数据或x-www-form-urlencoded工作以键值对的形式发送它。我认为它应该使用Java的urlencode方法工作,但是得到这个错误让我不知所措:不需要编码是个问题。403是关于授权的。这取决于服务器。我可以怀疑
会话\u令牌
页面\u令牌
的值。它也可以是用户代理的价值。在上次更新中:您确定video_id和session_token都是相同的吗?祝你好运…哎呀。。。很好地理解了价值观,但我还是得到了同样的问题。奇怪的是,它通过邮递员与同一个用户代理,我打印,以确保会话令牌正确出来。这和我喂邮递员一样。我又一次更新了这篇文章,上面有一张邮递员准确发送的照片。
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.