2017-01-16 13 views
5

ファイルのプッシュ通知を有効にするためにGoogleドライブAPIを呼び出すことができたばかりです。GoogleドライブAPIがプッシュ通知を送信するときのHTTP 302

プッシュ通知を設定するコードは次のようになります。私は、応答としてこれを取得するには、私のブラウザとログからのサーブレットのdoGetメソッドと呼ばた後

public class SampleServlet extends AbstractAppEngineAuthorizationCodeServlet { 
    private final static Logger logger = Logger.getLogger(SampleServlet.class.getName()); 
    private static final long serialVersionUID = 1L; 
    // Constants omitted 

    @Override 
    public void doGet(HttpServletRequest req, HttpServletResponse resp) 
      throws IOException, ServletException { 

     AuthorizationCodeFlow authFlow = initializeFlow(); 
     Credential credential = authFlow.loadCredential(getUserId(req)); 

     StringBuilder resultFromWatch = new StringBuilder(); 
     Drive drive = new Drive.Builder(Utils.HTTP_TRANSPORT, Utils.JSON_FACTORY, credential).setApplicationName("t").build(); 

     try { 
      Optional<Channel> channel = watchFile(drive, FILE_ID, CHANNEL_ID, "web_hook", "https://mydomain.appspot.com/drive"); 
      String channelStringTmp; 
      if (channel.isPresent()) { 
       channelStringTmp = channel.get().toString(); 
      } else { 
       channelStringTmp = "null..."; 
      } 
      resultFromWatch.append(channelStringTmp); 
     } catch (Exception e) { 
      resultFromWatch.append(e.getMessage()); 
     } 

     final UserService userService = UserServiceFactory.getUserService(); 
     final String thisUrl = req.getRequestURI(); 
     // Send the results as the response 
     PrintWriter respWriter = resp.getWriter(); 
     resp.setStatus(200); 
     resp.setContentType("text/html"); 

     addLoginLogoutButtons(req, resp, resultFromWatch, userService, thisUrl, respWriter); 
    } 

    private static Optional<Channel> watchFile(Drive service, String fileId, 
               String channelId, String channelType, String channelAddress) throws IOException { 
     final Channel returnValue; 
     Channel channel = new Channel(); 
     channel.setId(channelId); 
     channel.setType(channelType); 
     channel.setAddress(channelAddress); 
     Drive.Files tmp = service.files(); 
     returnValue = tmp.watch(fileId, channel).execute(); 
     return Optional.fromNullable(returnValue); 
    } 

    @Override 
    protected AuthorizationCodeFlow initializeFlow() throws ServletException, IOException { 
     return Utils.initializeFlow(); 
    } 

    @Override 
    protected String getRedirectUri(HttpServletRequest req) throws ServletException, IOException { 
     return Utils.getRedirectUri(req); 
    } 
} 

{ 
    "expiration": "1484565747000", 
    "id": SAME_ID_AS_DEFINED_IN_SERVLET, 
    "kind": "api#channel", 
    "resourceId": A_NEW_ID, 
    "resourceUri": "https:\/\/www.googleapis.com\/drive\/v3\/files\/FILE_ID?acknowledgeAbuse=false&alt=json" 
} 

次のステップでありますファイルが変更されたときに通知を受け取るコントローラを定義します。

@RestController 
@RequestMapping("/drive") 
public class ConcreteFileWatchController implements FileWatchController { 
    private final static Logger logger = Logger.getLogger(ConcreteFileWatchController.class.getName()); 

    @RequestMapping(method = RequestMethod.POST) 
    @ResponseStatus(value = HttpStatus.OK) 
    @Override 
    public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { 
     logger.info("Received watch call"); 
    } 
} 

最後に、私はアプリケーションをデプロイした後にファイルを変更しよう(それはGoogle App Engineの上に展開されます)、GAEにログを見た後、私は、コールがあったことがわかります。このようになります。しかし、私の受信方法は実行されません。私はログに302の大きなJSONが付いているのを見るだけです。私のメソッドが呼び出されたことに気づかないこと以外は、実際には何のエラーも見られません。パスはログ内で正しく表示されます。私は何が間違っていますか?エラーに関する

詳細:

私は、この302のメッセージを参照してくださいGoogleクラウド内のログ・ページにアクセスしてください。

{ 
    protoPayload: { 
    @ 
    type: "type.googleapis.com/google.appengine.logging.v1.RequestLog" 
    appId: "p~blabla" 
    versionId: "201t113050" 
    requestId: "587ca1bb00ff05706f727465726261636b656e640001323031373031313674313133303530000100" 
    ip: "10.76.94.97" 
    startTime: "2017-01-16T10:34:35.957904Z" 
    endTime: "2017-01-16T10:34:35.980366Z" 
    latency: "0.022462s" 
    method: "POST" 
    resource: "/drive" 
    httpVersion: "HTTP/1.1" 
    status: 302 
    userAgent: "APIs-Google; (+https://developers.google.com/webmasters/APIs-Google.html)" 
    host: "blabla.appspot.com" 
    instanceIndex: -1 
    finished: true 
    appEngineRelease: "1.9.48" 
    traceId: "d0e888dd390f41758fdf4" 
    first: true 
} 
insertId: "587cf6df9ded23f7" 
httpRequest: { 
status: 302 
} 
resource: { 
type: "gae_app" 
labels: {…} 
} 
timestamp: "2017-01-16T10:34:35.957904Z" 
labels: { 
appengine.googleapis.com/version_id: "2017013050" 
clone_id: "" 
appengine.googleapis.com/clone_id: "" 
appengine.googleapis.com/module_id: "default" 
version_id: "20170116t113050" 
request_id: "587ca1bb00ff0e9dd0f39f31350001707e6561737974696d657265706f721373031313674313133303530000100" 
appengine.googleapis.com/request_id: "587ca1bb00ff0e9dd0f39f31350001707e6561737974696d6572653674313133303530000100" 
module_id: "default" 
} 
logName: "projects/blabla/logs/appengine.googleapis.com%2Frequest_log" 
operation: { 
id: "587ca1bb00ff0e9dde640001323031373031313674313133303530000100" 
producer: "appengine.googleapis.com/request_id" 
first: true 
last: true 
} 
} 

11:34:35.957 
POST 
302 
0 B 
22 ms 
APIs-Google; (+https://developers.google.com/webmasters/APIs-Google.html) 
/drive 
10.72.94.97 - - [16/Jan/2017:11:34:35 +0100] "POST /drive HTTP/1.1" 302 - - "APIs-Google; (+https://developers.google.com/webmasters/APIs-Google.html)" "mydomain.appspot.com" ms=22 cpu_ms=0 cpm_usd=0 loading_request=0 instance=- app_engine_release=1.9.48 trace_id=d0e888dd3989e353344e40e41758fdf4 

も、このような種類の探してJSONがあります

web.xml:

<web-app> 
    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/mvc-dispatcher-servlet.xml</param-value> 
    </context-param> 
    <filter> 
     <filter-name>CORS</filter-name> 
     <filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class> 
    </filter> 
    <filter-mapping> 
     <filter-name>CORS</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 
    <listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 
    <servlet> 
     <servlet-name>dispatcher</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <init-param> 
      <param-name>contextConfigLocation</param-name> 
      <param-value></param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet> 
     <servlet-name>PlusBasicServlet</servlet-name> 
     <servlet-class>packagename.PlusBasicServlet</servlet-class> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>PlusBasicServlet</servlet-name> 
     <url-pattern>/plusbasicservlet</url-pattern> 
    </servlet-mapping> 

    <servlet> 
     <servlet-name>PlusSampleServlet</servlet-name> 
     <servlet-class>packagename.PlusSampleServlet</servlet-class> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>PlusSampleServlet</servlet-name> 
     <url-pattern>/plussampleservlet</url-pattern> 
    </servlet-mapping> 
    <servlet> 
     <servlet-name>FileWatchTestServlet</servlet-name> 
     <servlet-class>packagename.ConcreteFileWatchController</servlet-class> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>FileWatchTestServlet</servlet-name> 
     <url-pattern>/drive</url-pattern> 
    </servlet-mapping> 
    <servlet> 
     <servlet-name>PlusSampleAuthCallbackServlet</servlet-name> 
     <servlet-class>packagename.PlusSampleAuthCallbackServlet</servlet-class> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>PlusSampleAuthCallbackServlet</servlet-name> 
     <url-pattern>/oauth2callback</url-pattern> 
    </servlet-mapping> 
    <security-constraint> 
     <web-resource-collection> 
      <web-resource-name>any</web-resource-name> 
      <url-pattern>/plussampleservlet</url-pattern> 
     </web-resource-collection> 
     <auth-constraint> 
      <role-name>*</role-name> 
     </auth-constraint> 
    </security-constraint> 
</web-app> 
ログから

スクリーンショット:

enter image description here

+0

302エラーの説明を共有できますか? –

+0

クラウドログにあるすべてのデータを追加しました。 –

+0

私が間違っていない場合、HTTP 302はURLリダイレクトのコードです。あなたがリダイレクトされたURLにヒットする必要があるかもしれません。 –

答えて

2

あなたのコールバックはSpring MVCのを介して提供されているので、あなたが他の場所で設定された任意の隠されたリダイレクトを持っていないことを確認してください。あなたはまず、通常のサーブレットを使用してコールバックをテストする必要があります。

public class FileWatchTestServlet extends HttpServlet { 
    private final static Logger logger = Logger.getLogger(FileWatchTestServlet.class.getSimpleName()); 

    @Override 
    public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException { 
     logger.info("Received watch call"); 
    } 
} 

とweb.xml内:

<servlet> 
    <servlet-name>FileWatchTestServlet</servlet-name> 
    <servlet-class>com.mydomain.FileWatchTestServlet</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>FileWatchTestServlet</servlet-name> 
    <url-pattern>/drive</url-pattern> 
</servlet-mapping> 

302が消える場合、問題はSpring MVCののディスパッチャであるので、あなたはそこになりますリダイレクトを引き起こす可能性のあるもの(例:あなたのビュー)。

+0

提案していただきありがとうございます。まだ302.ログからスクリーンショットを投稿する。リダイレクトは私のセキュリティ設定でGoogleのユーザー認証にリダイレクトされていると思います。しかし、それを修正する方法を知らない。 –

+0

セキュリティ制約は '/ rest/plussampleservlet'にのみ適用されます。実際には、[plus-appengine-sample](https://github.com/google/google-api-java-client-samples/tree/master/plus)からコピーされているように見えます-appengine-sample)これを削除する必要があります。既に持っている場合は、あなたのアプリケーションに関連する設定だけを持つ更新されたweb.xmlを投稿してください。 – Adam

+0

さらに、仮説を検証する別の方法は、セクション全体をコメントアウトしてテストすることです。 – Adam

関連する問題