使用Java访问Instagram API时出现错误400

使用Java访问Instagram API时出现错误400,java,oauth,instagram,Java,Oauth,Instagram,我有一个名为Autentica的简单servlet,负责获取用于了解OAuth令牌的de代码参数。API返回到我的回调页面,因此运行名为callback的servlet。问题是我无法从OAuth获取令牌,因为我从服务器接收到错误400。我不是网络编程专家,可能是个新手 有人能帮我吗?遵循servlet代码和控制台结果。太多了 1) 奥特提卡酒店 @WebServlet(name = "autentica", urlPatterns = {"/autentica"}) public class A

我有一个名为Autentica的简单servlet,负责获取用于了解OAuth令牌的de代码参数。API返回到我的回调页面,因此运行名为callback的servlet。问题是我无法从OAuth获取令牌,因为我从服务器接收到错误400。我不是网络编程专家,可能是个新手

有人能帮我吗?遵循servlet代码和控制台结果。太多了

1) 奥特提卡酒店

@WebServlet(name = "autentica", urlPatterns = {"/autentica"})
public class Autentica extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        processRequest(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        processRequest(req, resp);
    }

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();

        //API Credentials
        String client_id = "XXXX";
        String client_secret = "YYYY";
        String redirect_uri = "http://localhost:8080/InstagramAPI/callback";

        //Set Session Variables
        HttpSession session = request.getSession(true);
        session.setAttribute("client_id", client_id);
        session.setAttribute("client_secret", client_secret);
        session.setAttribute("redirect_uri", redirect_uri);

        try {
            //Redirect User to foursquare login page
            String url = "https://api.instagram.com/oauth/authorize/?client_id=" 
                    + client_id + "&redirect_uri=" + redirect_uri
                    + "&response_type=code";
            response.sendRedirect(url);
        } finally {
            out.close();
        }
    }
}
2) Servlet回调

@WebServlet(name = "callback", urlPatterns = {"/callback"})
public class Callback extends HttpServlet{

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        processRequest(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        processRequest(req, resp);
    }

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        HttpSession session = request.getSession(true);
        String clientID =(String)session.getAttribute("client_id");
        String clientSecret =(String)session.getAttribute("client_secret");
        String redirectURI =(String)session.getAttribute("redirect_uri");  
        String code = request.getParameter("code");

        String url = "https://api.instagram.com/oauth/access_token?"
                + "client_id=" + clientID
                + "&client_secret=" + clientSecret
                + "&grant_type=authorization_code"
                + "&redirect_uri=" + redirectURI
                + "&code="+code;
        getContent(url);
    }

    //Return response after GET Request
    public String getContent(String httpurl){
        try {
            URL url = new URL(httpurl);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("POST");
            BufferedReader in = new BufferedReader(new InputStreamReader(
                    conn.getInputStream()));
            String strLine = "";
            String content = "";
            while ((strLine = in.readLine()) != null){
                 content = content+strLine;
            }
            in.close();
            System.out.println("DEBUG = "+content);
            return content;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}
3) 控制台


您将数据错误地发送到访问令牌URL。您需要发送POST请求数据中的字段。不作为URL的一部分。URL应仅为“https://api.instagram.com/oauth/access_token“其余的数据应该以URL格式编码为帖子中的数据。

已经有了一个完美的答案

您必须添加以下内容:

String urlParameters = "client_id=" + clientID
            + "&client_secret=" + clientSecret
            + "&grant_type=authorization_code"
            + "&redirect_uri=" + redirectURI
            + "&code="+code;

connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
connection.setRequestProperty("charset", "utf-8");
connection.setRequestProperty("Content-Length", "" + Integer.toString(urlParameters.getBytes().length));

DataOutputStream wr = new DataOutputStream(connection.getOutputStream ());
wr.writeBytes(urlParameters);
wr.flush();
wr.close();

在您的
conn.setRequestMethod(“POST”)之后

您正在调用的URL有问题。它的格式不正确。您只需输入url部分,就可以从任何浏览器连续访问相同的url吗?谢谢您的帮助!干杯当然可以,@mark-s!一个愚蠢的错误让我学到了很多!非常感谢!非常感谢你,简·格林格!它对我很有用!Tks!不客气:)如果您认为您的问题有正确的解决方案,您可以将该答案标记为解决方案,并帮助具有相同问题的其他用户更快地找到它。
String urlParameters = "client_id=" + clientID
            + "&client_secret=" + clientSecret
            + "&grant_type=authorization_code"
            + "&redirect_uri=" + redirectURI
            + "&code="+code;

connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
connection.setRequestProperty("charset", "utf-8");
connection.setRequestProperty("Content-Length", "" + Integer.toString(urlParameters.getBytes().length));

DataOutputStream wr = new DataOutputStream(connection.getOutputStream ());
wr.writeBytes(urlParameters);
wr.flush();
wr.close();