我为POST方法指定了正确的参数和标题,但响应代码为400

时间:2019-07-15 23:01:32

标签: java post httpurlconnection http-status-code-400 bad-request

我试图将SnapChat登录工具集成到我的Web应用程序中。我可以从SnapChat获取授权代码,但是在获取访问令牌时遇到了麻烦。 我已经完成了FB,Google,Instagram登录集成的完美工作,但是我完全迷失了这一点。

我尝试对参数进行编码,更改标头的顺序,但始终给我400错误的请求。

try {
        URL url = null;
        if(service.equals(APIConstants.GOOGLE))
            url = new URL(SNSIdentifications.GOOGLE_TOKEN_REQUEST_URL);
        else if (service.equals(APIConstants.FACEBOOK))
            url = new URL(SNSIdentifications.FACEBOOK_TOKEN_REQUEST_URL);
        else if (service.equals(APIConstants.INSTAGRAM))
            url = new URL(SNSIdentifications.INSTAGRAM_TOKEN_REQUEST_URL);
        else 
            url = new URL(SNSIdentifications.SNAPCHAT_TOKEN_REQUEST_URL);
        conn = (HttpsURLConnection) url.openConnection();
        conn.setRequestMethod("POST");
        conn.setDoOutput(true);
        if(service.equals(APIConstants.SNAPCHAT)) {
//              String userCredentials = URLEncoder.encode(client_id + ":" + secret, "UTF-8");
            String userCredentials = client_id + ":" + secret;
            byte[] data = Base64.getEncoder().encode(userCredentials.getBytes());
            String authorizationHeaderBase64 = new String(data);
            conn.setRequestProperty( "Content-Type", "application/x-www-form-urlencoded" );
            conn.setRequestProperty( "Authorization", "Basic " + authorizationHeaderBase64);
//              conn.setRequestProperty("charset", "utf-8");
                //Integer.toString(payload.getBytes(StandardCharsets.UTF_8).length)
//                  conn.setRequestProperty( "Content-Length", Integer.toString(payload.getBytes(StandardCharsets.UTF_8).length)  );

            writer = new OutputStreamWriter(conn.getOutputStream());
//              writer.write(URLEncoder.encode(payload, "UTF-8"));
            writer.write(params);
            writer.flush();
            System.out.println(conn.getResponseCode() + " " + conn.getResponseMessage() + " ");

        } else {
            writer = new OutputStreamWriter(conn.getOutputStream());
                writer.write(params);
                writer.flush();
        }
        int responseCode = conn.getResponseCode();
        if(responseCode == HttpURLConnection.HTTP_OK) {
            return new JSONObject(fetchResponse(conn));
        } 
} catch (IOException e) {
        e.printStackTrace();
}

我应该从上面的代码中获得访问令牌,刷新令牌和expires_in值,但不幸的是,由于400错误的请求错误,它无法实现。

1 个答案:

答案 0 :(得分:0)

我解决了这个问题。原来,这是问题的几种组合。 当我遇到问题时,请检查以下内容:

  1. 确保您使用的客户端ID和密码正确。
  2. 如果要添加代码挑战和代码挑战方法参数,则需要具有代码验证程序才能获取访问令牌。如果您没有这些参数,则无需担心获取访问令牌。
  3. 设置标题“授权”时,请使用base64编码,而不要使用base16编码。 (Snapchat页面显示为base16,但在示例中为64)。
  4. 再次用这些URL,ID和秘密检查您的URL,ID,以获取授权码。

:)