簡體   English   中英

如何使用 jsonrpc4j 客戶端將對象作為參數傳遞?

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

https://github.com/xiaocong/android-uiautomator-server/blob/master/app/src/androidTest/java/com/github/uiautomator/stub/AutomatorService.java#L400

這是我的測試代碼:

@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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM