使用Java访问Instagram API时出现错误400
我有一个名为Autentica的简单servlet,负责获取用于了解OAuth令牌的de代码参数。API返回到我的回调页面,因此运行名为callback的servlet。问题是我无法从OAuth获取令牌,因为我从服务器接收到错误400。我不是网络编程专家,可能是个新手 有人能帮我吗?遵循servlet代码和控制台结果。太多了 1) 奥特提卡酒店使用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
@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();