java - 使用 Java/App Engine 向 Blogger 发出 API 请求的正确形式 - 错误 401

标签 java google-app-engine blogger google-api-java-client

我在调用 Blogger API 时为 JAVA 形成正确的 api 语句时遇到了问题。

我已经通过 Google Cloud Console 测试了我的语句,它可以工作,但在我的代码中不起作用。我正在使用 Google App Engine,并且已获得使用 Blogger 的授权。该授权还与运行 Google App Engine 的帐户相关联。

任何想法都会有帮助......周末尝试了很多事情。

谢谢

Request
GET https://www.googleapis.com/blogger/v3/blogs/7676001971884966148/posts?key=   {YOUR_API_KEY}

Authorization:  Bearer ya29.1.AADtN_Vd7lKj8Xy3KbZ1veJjjjv712Nc1erLY2dmAK3gorNilVd0652vnqrrovfuLfSKkQ
X-JavaScript-User-Agent:  Google APIs Explorer


Response
200 OK

- Show headers -

{
"kind": "blogger#postList",
"nextPageToken": "CgkIChjim-ftqygQhIKb6_zjqMNq",
"items": [
{
etc.....

我的代码

public class BloggerHandler
{

  public static final Logger log = Logger.getLogger(BloggerHandler.class.getName());

public void testCreds() throws Exception  {
   try{
   ArrayList<String> scopes = new ArrayList<String>();
    scopes.add("https://www.googleapis.com/auth/blogger");
    scopes.add("https://www.googleapis.com/auth/blogger.readonly");


    AppIdentityService appIdentity = AppIdentityServiceFactory.getAppIdentityService();
    AppIdentityService.GetAccessTokenResult accessToken = appIdentity.getAccessToken(scopes);
    // The token asserts the identity reported by appIdentity.getServiceAccountName()
    JSONObject request = new JSONObject();
   //request.put("maxPosts", "1");

   //request.put("view", "AUTHOR");

    log.info("request!!!" + request);

     URL url = new URL("https://www.googleapis.com/blogger/v3/blogs/7676001971884966148/posts?");
     log.info("URL:" + url);
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    connection.setDoOutput(true);
    connection.setRequestMethod("GET");
    connection.addRequestProperty("Content-Type", "application/json");
    connection.addRequestProperty("Authorization", "OAuth" + accessToken.getAccessToken());

    log.info("Con!!" + connection);


    OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream());
    request.write(writer);
    writer.close();
     log.info("connection:" + connection.getResponseCode());
     if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
        // Note: Should check the content-encoding.
        JSONTokener response_tokens = new JSONTokener(connection.getInputStream());
        JSONObject response = new JSONObject(response_tokens);

        log.info("resp:" + response.get("title")); 




     } // end if 

     else {
        throw new Exception();
     }// end else

     } // end try

     catch (Exception e) {
    // Error handling elided.
    log.info("ex:" + e);


    }
// end catch



}// end void


}// end class

最佳答案

经过几个漫长的夜晚,我终于弄清楚如何从 GAE 项目访问 Google Blogger API。

我所做的一些关键事情可能会对您有所帮助。

  • 在您的 Google Appe Engine 项目中,确保它已链接到 Google API 控制台。在 GAE 管理项目屏幕中,您应该会看到 Google API 控制台项目编号:XX
  • 在 Google API Cloud 控制台中,确保您已获得 Blogger(或您想要使用的任何云 API)的授权。创建一个项目(网站等)并复制它为您提供的 API 字符串。

一旦您拥有该 API 字符串,下面的代码应该可以帮助您开始基本连接。

下面的代码应返回与您尝试访问的当前博客的统计信息的“200”连接。从这里您可以扩展 API。

//顺便说一句,我知道有一种方法可以从 Google Cloud 读取 API,因此它不必是代码的一部分。仍在研究该工作流程。

import java.util.logging.Logger;
import java.util.Arrays;
import com.google.api.client.googleapis.extensions.appengine.auth.oauth2.AppIdentityCredential;
import com.google.api.services.blogger.Blogger;
import com.google.api.services.blogger.Blogger.Blogs.GetByUrl;
import com.google.api.services.blogger.Blogger.Posts.List;
import com.google.api.services.blogger.BloggerScopes;
import com.google.api.services.blogger.model.Blog;
import com.google.api.services.blogger.model.Post;
import com.google.api.services.blogger.model.PostList;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.client.extensions.appengine.http.UrlFetchTransport;
import java.io.IOException;

public class BlogHandler
{
  public Blogger blogger = null;
  public Blog blog;
  public java.util.List<Post> posts;
  public static final Logger log = Logger.getLogger(EngineParseFeed.class.getName());
  static final String API_KEY = "{Your GOOGLE CLOUD API}";

  public BlogHandler() {}

  public void setupService () throws IOException {

    AppIdentityCredential credential = null;
    credential  = new AppIdentityCredential(Arrays.asList(BloggerScopes.BLOGGER)); // Add your scopes here
    this.blogger = new Blogger.Builder(new UrlFetchTransport(), new JacksonFactory(), credential).setApplicationName("trivalAPPName").build();
   }

   public void executeGetBlogByUrl (String url) throws IOException {
     GetByUrl request = blogger.blogs().getByUrl( url );
     this.blog = request.setKey(API_KEY).execute();
     log.info ("Blog" + this.blog);
   }

关于java - 使用 Java/App Engine 向 Blogger 发出 API 请求的正确形式 - 错误 401,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20462705/

相关文章:

java - 找不到媒体类型 MessageBodyWriter=Application/json,glassfish

java - 使用带有官方 Google Appengine Maven 插件的 Java 7

javascript - 在博客上的 mathjax 预览中显示新行

javascript - 使用 Blogger API 删除帖子

delphi - 博主通过 idHTTP : error 400 bad request

java - 如何模拟使用供应商创建并使用两次的流?

java - PHP Exec 和命令提示符 (cmd) 中的编码不同

java - 无法实例化类型 SocketChannel

python - 计算游戏的高分表

google-app-engine - 有人准备为 GAE 创建基于 tomcat 的替代方案吗?