2017-01-16 27 views
5

Bir dosya için push bildirimlerini etkinleştirmek üzere Google Drive API'sini aramayı başardım.HTTP 302 Google Drive API push bildirimleri gönderdiğinde

push bildirimleri kurma kod şuna benzer: Ben cevap olarak bu olsun benim tarayıcı ve günlük gelen servlet'ler doGet denilen ettikten sonra

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" 
} 

Sonraki adım dosya değiştirilirken bildirimleri alan denetleyicimi tanımlamak için. Bu gibi görünüyor:

@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"); 
    } 
} 

Sonunda (Google App Engine üzerinde dağıtıldığı) uygulaması dağıtılan sonra dosyayı değiştirmeye çalışırsanız ve GAE içinde günlükleri baktıktan sonra ben bir çağrı olduğuna dair görebilirsiniz. Ancak, benim alma yöntemim yürütülmedi. Sadece bir 302'yi günlüğe bağlı büyük bir jsonla görüyorum. Benim yöntemimin çağrıldığını fark etmeme dışında bir hata göremiyorum. Yol günlüğünde bile doğru görünüyor. Ne yanlış yapabilirdim? hatayla ilgili olarak

Detayları:

Ben bu 302 mesajı görmek Google Cloud günlük sayfasına gidin:

{ 
    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 

da böyle tür görünümlü bir json vardır

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> 
günlüğünden

Ekran Görüntüsü: Geri arama Bahar MVC aracılığıyla sunulmakta olduğundan

enter image description here

+0

302 hatasının açıklamasını paylaşabilirsiniz? –

+0

Bulut günlüğünde bulabildiğim tüm verileri ekledim. –

+0

HTTP 302, yanılmıyorsam URL yönlendirme kodudur. Yönlendirdiğiniz URL'yi vurmanız gerekebilir .. –

cevap

2

, başka bir yerde yapılandırılmış herhangi gizli yönlendirmelerin olmaması emin olun.

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"); 
    } 
} 

Ve web.xml''deki

: Oraya bakmak gerekir böylece

<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 uzağa giderse, konu, Bahar MVC'ın memuru ile Önce normal bir servlet'dir kullanarak geri arama test etmelidir Yönlendirmeye neden olabilecek her şey için (örneğin, sizin bakış açınız).

+0

Öneriniz için teşekkürler.Hala 302'yi almak. Kayıttan bir ekran görüntüsü yayınlamak. Yönlendirmenin, beni Google kullanıcı kimlik doğrulamasına yönlendiren güvenlik yapılandırmam olduğunu düşünüyorum. Bunu nasıl düzelteceğimi bilmiyorum. –

+0

Güvenlik kısıtlamalarınız sadece '/ rest/plussampleservlet' için geçerli görünüyor. Aslında orada [artı-appengine-sample] (https://github.com/google/google-api-java-client-samples/tree/master/plus adresinden kopyalanmakta olduğu gibi görünüyor. -appengine-sample) bu yüzden bunu kaldırmalısınız. Zaten sahipseniz, lütfen uygulamanızla ilgili yalnızca yapılandırmaya sahip olan güncellenmiş web.xml dosyanızı gönderin. – Adam

+0

Ayrıca, hipotezinizi doğrulamanın bir başka yolu da, yorumlanan tüm bölümü ile test etmektir. – Adam