简体   繁体   English

Android Retrofit2 RxJava,如何解决Google身份验证令牌的错误?

[英]Android Retrofit2 RxJava, how solve error with Google authentication token?

Please, help me guys! 拜托,帮帮我! I have a list files in app, these files can be marked as read and unread. 我在应用程序中有一个列表文件,这些文件可以标记为已读和未读。 When this action is executed, a request is made to the server to store this state. 执行此操作后,将向服务器发出存储此状态的请求。 But I ran into an error: 但是我遇到了一个错误:

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 server have such parameters: 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"
          }
        ]

In Android I have rest method in ApiServiceInterface: 在Android中,我在ApiServiceInterface中有rest方法:

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

And here I wrote down a consistent chain of methods calls, when I made debug. 在进行调试时,我在这里写下了一致的方法调用链。 I really hope that it will be clear. 我真的希望一切都会清楚。

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

All methods for queries to the server are similar. 查询服务器的所有方法都是相似的。 I suspect that something is wrong with the lifetime of the token, but how to resolve this problem. 我怀疑令牌的生存期有问题,但如何解决此问题。 I hope someone will help me with advice. 我希望有人能帮助我提供建议。 If something isn't clear, please ask me. 如果不清楚,请问我。

I got error 400, because in my case I have to remake rest method and add one parametr like this: 我收到错误400,因为在我的情况下,我必须重新制作rest方法并添加一个这样的参数:

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

Then I still got error 402, this is due to the fact that I was sending incorrect parameters and I minor fix my method onClickThumbnailToggle: 然后我仍然收到错误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();
            }
    }
}

Also change parametr in toggleDocument in class RestFolderRepository. 还可以在类RestFolderRepository中的toggleDocument中更改参数。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM