2017-04-06 64 views
0

请帮帮我吧!我在应用程序中有一个列表文件,这些文件可以标记为已读和未读。执行此操作时,会向服务器发出请求以存储此状态。但是,我遇到了一个错误:Android Retrofit2 RxJava,Google身份验证令牌如何解决错误?

04-06 06:30:00.384 22760-1489/me.android.app D/OkHttp: <-- 400 BAD REQUEST https://api.me/api/v1/2/setDocumentAttribute?token=q4B97JQBCKcZYCjVVw6v-cFMC4I2JoMd-MmCir7VvuLZl15J_Ztqm2JpbKwraRDmqWEyZOxJWzoy_eOKv0U2XX2a-9GL_7cXkOMyT20BLaqHb3nJSGoJnPU2cCFigEtC4TLhSIh_brpF_KNNeZ8_MqzEaomiTSYVtkx6RnL7ohPLPh8ZjMK2ow%3D%3D&documentID=33fe7dcb697f613c56f449754e923c53&path=Personal&attrName=isNew (99ms) 
04-06 06:30:00.384 22760-1489/me.android.app D/OkHttp: Access-Control-Allow-Origin: * 
04-06 06:30:00.384 22760-1489/me.android.app D/OkHttp: Content-Type: application/json 
04-06 06:30:00.384 22760-1489/me.android.app D/OkHttp: Date: Thu, 06 Apr 2017 03:30:00 GMT 
04-06 06:30:00.384 22760-1489/me.android.app D/OkHttp: Server: Apache/2.4.23 (Amazon) mod_wsgi/3.5 Python/2.7.12 
04-06 06:30:00.384 22760-1489/me.android.app D/OkHttp: Content-Length: 97 
04-06 06:30:00.384 22760-1489/me.android.app D/OkHttp: Connection: keep-alive 
04-06 06:30:00.384 22760-1489/me.android.app D/OkHttp: {"message": "Input payload validation failed", "errors": {"token": "Security token"}} 

API服务器有这样的参数:

 "parameters": [ 
      { 
      "in": "query", 
      "type": "string", 
      "description": "Pagination token", 
      "name": "pageToken" 
      }, 
      { 
      "in": "query", 
      "type": "string", 
      "description": "(True, False) Returns hierachy only, including empty folders", 
      "name": "hierarchyOnly" 
      }, 
      { 
      "in": "query", 
      "type": "string", 
      "description": "Parent folder ID", 
      "name": "parent" 
      }, 
      { 
      "in": "query", 
      "type": "string", 
      "description": "Valid security token", 
      "name": "token" 
      }, 
      { 
      "description": "An optional fields mask", 
      "format": "mask", 
      "type": "string", 
      "name": "X-Fields", 
      "in": "header" 
      } 
     ] 

在Android中我有其他方法ApiServiceInterface:

@POST("setDocumentAttribute") 
    Observable<String> setDocumentAttribute(
      @Query(TOKEN) String token, 
      @Query(DOCUMENT_ID) String documentId, 
      @Query("path") String path, 
      @Query("attrName") String attrName); 

在这里,我写下了一致方法调用链,当我做调试时。我真的希望它会很清楚。

DocCompanyPresenter 
    public void onClickThumbnailToggle(DocItem docItem) { 
      Log.d(TAG, "***onClickThumbnailToggle"); 
      if (getView() != null) { 
       String docId = docItem.getDocLink(); 
       if (!TextUtils.isEmpty(docId)) { 
        boolean toggle = docItem.getNewDocs()>0; 
        if (toggle) { 
         docItem.setNewDocs(0); // make star (read) 
         Log.d(TAG, "***done read"); 
        } else { 
         docItem.setNewDocs(1); // make isNew (unread) 
         Log.d(TAG, "***done unread"); 
        } 

        getView().updateListDocs(getDocPos(docItem.getDocLink())); 
        getView().toggleDocument(leftPanelDocIdMark,!toggle);  -> 

        docId = docId.substring(0,docId.indexOf(".")); 

        toggleDocument.toggleDocument(docId,docItem.getPath(),!toggle) 
          .subscribeOn(Schedulers.io()) 
          .observeOn(AndroidSchedulers.mainThread()) 
          .subscribe(); 
       } 
      } 
     } 

     FolderCompanyFragment 
     @Override 
      public void toggleDocument(String folderId, boolean toggle) { 
       toggleDocument.actionToggleDocument(folderId,toggle);  -> 
      } 

     -> 

     MainActivity 
     @Override 
      public void actionToggleDocument(String folderId, boolean toggle) { 
       Fragment fragment = getSupportFragmentManager().findFragmentByTag(FolderListFragment.TAG); 
       if (fragment instanceof ActionToggleDocument) { 
        ((ActionToggleDocument) fragment).actionToggleDocument(folderId,toggle);  -> 
       } 
      } 

     -> 

     FolderListFragment 
     @Override 
      public void actionToggleDocument(String folderId, boolean toggle) { 
       getPresenter().onFolderToggleDocument(folderId,toggle); 
      } 

     ->onClickThumbnailToggle -> toggleDocument.toggleDocument(docId,docItem.getPath(),!toggle) 
           .subscribeOn(Schedulers.io()) 
           .observeOn(AndroidSchedulers.mainThread()) 
           .subscribe(); <- 

     RestFolderRepository 
     @Override 
      public Observable<String> toggleDocument(String documnetId, String path, boolean toggle) { 

       return apiService.setDocumentAttribute(preferencesRepository.getToken(),documnetId,path,toggle?"isNew":"star") 
         .subscribeOn(Schedulers.io()) 
         .onErrorReturn(throwable -> { 
          throwable.printStackTrace(); 
          return null; 
         }) 
         .map(aVoid -> "OK"); 
      } 

     FolderCompanyFragment 
     @Override 
      public void onClickThumbnailToggle(DocItem docItem) { 
       getPresenter().onClickThumbnailToggle(docItem); 
      } 

查询服务器的所有方法都是类似的。我怀疑令牌的生命周期有什么问题,但是如何解决这个问题。我希望有人能帮助我提供建议。如果有什么不清楚的地方,请问我。

+0

请,我需要一些想法,一些赞成,一些帮助! –

回答

0

我得到错误400,因为在我的情况下,我不得不重拍休息方法,并添加一个parametr这样的:

@FormUrlEncoded 
    @POST("setDocumentAttribute") 
    Observable<String> setDocumentAttribute(
      @Field(TOKEN) String dokkaToken, 
      @Field(DOCUMENT_ID) String documentId, 
      @Field("path") String path, 
      @Field("attrName") String attrName, 
      @Field("attrData") int attrData); 

然后我仍然有402错误,这是由于这样的事实,我会发送不正确的参数,我小的修复我的方法onClickThumbnailToggle:

public void onClickThumbnailToggle(DocItem docItem) { 
     Log.d(TAG, "***onClickThumbnailToggle"); 
     if (getView() != null) { 
      String docId = docItem.getDocLink(); 
      if (!TextUtils.isEmpty(docId)) { 
       boolean toggle = docItem.getNewDocs()>0; 
       if (toggle) { 
        Log.d(TAG, "***done read"); 
        docItem.setNewDocs(0); // make star (read) 
        attrData = 0; 
       } else { 
        Log.d(TAG, "***done unread"); 
        docItem.setNewDocs(1); // make isNew (unread) 
        attrData = 1; 
       } 
       getView().updateListDocs(getDocPos(docItem.getDocLink())); 
       getView().toggleDocument(leftPanelDocIdMark,!toggle); 
       toggleDocument.toggleDocument(docId,docItem.getPath(),ATTR_NAME, attrData) 
         .subscribeOn(Schedulers.io()) 
         .observeOn(AndroidSchedulers.mainThread()) 
         .subscribe(); 
      } 
    } 
} 

类RestFolderRepository也改变parametr在toggleDocument。