[英]How do I pass objects as parameters using the jsonrpc4j client?
我正在嘗試編寫一個使用 jsonrpc4j ( https://github.com/briandilley/jsonrpc4j ) 與運行在 Android 設備上的服務器通信的 Kotlin 客戶端。 這是我正在使用的服務器: https ://github.com/xiaocong/android-uiautomator-server
調用采用單個參數的方法,例如null
或單個String
對象可以正常工作。 但是,如果我嘗試調用方法boolean exist(Selector obj);
方法匹配不起作用,我得到一個異常:
Invalid method parameters
com.googlecode.jsonrpc4j.JsonRpcClientException: Invalid method parameters
at com.googlecode.jsonrpc4j.DefaultExceptionResolver.createJsonRpcClientException(DefaultExceptionResolver.java:53)
at com.googlecode.jsonrpc4j.DefaultExceptionResolver.resolveException(DefaultExceptionResolver.java:28)
at com.googlecode.jsonrpc4j.JsonRpcClient.handleErrorResponse(JsonRpcClient.java:272)
at com.googlecode.jsonrpc4j.JsonRpcClient.readResponse(JsonRpcClient.java:196)
at com.googlecode.jsonrpc4j.JsonRpcClient.readResponse(JsonRpcClient.java:531)
at com.googlecode.jsonrpc4j.JsonRpcHttpClient.invoke(JsonRpcHttpClient.java:148)
at com.googlecode.jsonrpc4j.JsonRpcHttpClient.invoke(JsonRpcHttpClient.java:118)
at com.googlecode.jsonrpc4j.JsonRpcHttpClient.invoke(JsonRpcHttpClient.java:176)
...
這是我的測試代碼:
@Test fun methodTest() {
val client = JsonRpcHttpClient(URL("http://localhost:9008/jsonrpc/0"))
val invoke = client.invoke("ping", null, Object::class.java)
println(invoke) // prints "pong"
val selector = Selector()
selector.packageName = "com.company.appname"
val exists = client.invoke("exist", selector, Boolean::class.java) // throws Exception
println(exists)
}
我調試了服務器代碼,看起來好像 Selector 類型丟失了,所有參數都“展平”為字符串列表:
09-17 18:05:58.216 D/UIAutomatorStub(17611):URI:/jsonrpc/0,方法:POST,標頭:{content-length=620,remote-addr=127.0.0.1,http-client-ip=127.0 .0.1, host=localhost:9008, content-type=application/json-rpc, connection=keep-alive, cache-control=no-cache, pragma=no-cache, user-agent=Java/1.8.0_265, 接受=文本/html、圖像/gif、圖像/jpeg、*; q=.2, / ; q=.2},參數,{NanoHttpd.QUERY_STRING=null},文件:{postData={"id":"61840997","jsonrpc":"2.0","method":"exist","params": {"packageName":"com.company.appname","text":null,"className":null,"description":null,"textContains":null,"textMatches":null,"textStartsWith":null," classNameMatches":null,"descriptionContains":null,"descriptionMatches":null,"descriptionStartsWith":null,"checkable":false,"checked":false,"clickable":false,"scrollable":false,"longClickable" :false,"enabled":false,"focusable":false,"focused":false,"selected":false,"packageNameMatches":null,"resourceId":null,"resourceIdMatches":null,"mask":0 ,"childOrSiblingSelector":[],"childOrSibling":[],"index":0,"instance":0}}}
我將Selector
類從服務器復制到宿主項目中並按原樣使用: https ://github.com/xiaocong/android-uiautomator-server/blob/master/app/src/androidTest/java/com/github/ uiautomator/stub/Selector.java
我還嘗試使用@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property="class")
對類進行注釋,但唯一的效果是它向“params”添加了“class”屬性。
如何使它工作,以便我可以在客戶端使用服務器的參數類型?
任何參數都必須傳遞到數組中。 因此,在您的情況下,JAVA 中的代碼將是:
Boolean exists = client.invoke("exist", new Object[]{selector}, Boolean.class);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.