[英]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.