Android版的Restlet与AppEngine上通讯错误错误、通讯、Android、Restlet

2023-09-07 09:08:55 作者:猜不到結局

我有同样的问题:的http://restlet.tigris.org/ds/viewMessage.do?dsForumId=4447&dsMessageId=2838513

我试图让一个非常简单的应用和Android一GAE之间的沟通和我面临同样的问题。

I've try to make a very simple application with communication between a GAE and android And I'm facing the same problem.

我有2.1快照(2012-01-15)Android版我有2.1快照(2012-01-15)GAE版

I have the 2.1 Snapshot (2012-01-15) android version I have the 2.1 Snapshot (2012-01-15) gae version

在机器人的classpath中我有:

In the classPath of android I have :

org.restlet.ext.jackson org.restlet 杰克逊all.1.9.3

我有一个共享的源文件夹和我的GAE应用资源共享和豆类

I have a shared source folder with my GAE application for sharing resources and beans

在GAE的classpath中我有: * org.restlet.ext.jackson * org.restlet.ext.json * org.restlet.ext.servlet * org.restlet *杰克逊all.1.9.3

In the classPath of GAE I have : * org.restlet.ext.jackson * org.restlet.ext.json * org.restlet.ext.servlet * org.restlet * jackson-all.1.9.3

下面是我的web.xml:

Here is my web.xml :

<servlet-name>RestletServlet</servlet-name>
<servlet-class>org.restlet.ext.servlet.ServerServlet</servlet-class>
<init-param>
<param-name>org.restlet.application</param-name>
<param-value>com.binomed.server.rest.RestletApplication</param-value>
</init-param>
</servlet>
<!-- Catch all requests -->
<servlet-mapping>
<servlet-name>RestletServlet</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>

下面是共享code:




    package com.binomed.client.rest;
    import org.restlet.resource.Get;
    import com.binomed.client.rest.dto.RestletObjectA;

    public interface IRestletService {

    @Get
    RestletObjectA getMessage() throws Exception;

    }

    package com.binomed.client.rest.dto;

    import java.io.Serializable;
    import java.util.List;

    public class RestletObjectA implements Serializable {



    /**
    * 
    */
    private static final long serialVersionUID = 1L;



    public RestletObjectA() {
    super();
    }



    private RestletObjectB objectB;

    private List listObjectB;

    private String name;


    public RestletObjectB getObjectB() {
    return objectB;
    }


    public void setObjectB(RestletObjectB objectB) {
    this.objectB = objectB;
    }


    public List getListObjectB() {
    return listObjectB;
    }



    public void setListObjectB(List listObjectB) {
    this.listObjectB = listObjectB;
    }

    public String getName() {
    return name;
    }

    public void setName(String name) {
    this.name = name;
    }

    }

    package com.binomed.client.rest.dto;

    import java.io.Serializable;

    public class RestletObjectB implements Serializable {



    /**
    * 
    */
    private static final long serialVersionUID = 1L;

    public RestletObjectB() {
    super();
    }

    private String name;

    public String getName() {
    return name;
    }



    public void setName(String name) {
    this.name = name;
    }

    }


这是我服务的实现:




    package com.binomed.server.rest;

    import java.util.ArrayList;

    import org.restlet.resource.Get;
    import org.restlet.resource.ServerResource;

    import com.binomed.client.rest.IRestletService;
    import com.binomed.client.rest.dto.RestletObjectA;
    import com.binomed.client.rest.dto.RestletObjectB;

    public class RestResource extends ServerResource implements IRestletService {



    @Override
    @Get
    public RestletObjectA getMessage() throws Exception {
    RestletObjectB objB = new RestletObjectB();
    objB.setName("ObjectB");

    RestletObjectA result = new RestletObjectA();
    result.setName("ObjectA");
    result.setListObjectB(new ArrayList());
    result.getListObjectB().add(objB);
    result.setObjectB(objB);

    return result;
    }

    }





    package com.binomed.server.rest;

    import org.restlet.Application;
    import org.restlet.Restlet;
    import org.restlet.routing.Router;

    public class RestletApplication extends Application {



    /**
    * Creates a root Restlet that will receive all incoming calls.
    */
    @Override
    public Restlet createInboundRoot() {
    // Create a router Restlet that routes each call to a
    // new instance of HelloWorldResource.
    Router router = new Router(getContext());

    // Defines only one route
    // router.attachDefault(new Directory(getContext(), "war:///"));
    // router.attach("/test/", RestResource.class);
    router.attachDefault(RestResource.class);

    return router;
    }

    }


如果我尝试的网址:的http://本地主机:8888 / REST / 它的作品,我有{对象B:{名:对象B},listObjectB:[{名:对象B}],名:对象A}。作为回报是完全以正常

If I try the url : http://localhost:8888/rest/ it works, I have {"objectB":{"name":"ObjectB"},"listObjectB":[{"name":"ObjectB"}],"name":"ObjectA"} as return which is totaly normal.

下面是我的android code:

Here is my android code :




    // Use an AsyncTask to avoid blocking the UI thread
    new AsyncTask() {

    @Override
    protected RestletObjectA doInBackground(Void... arg0) {
    try {
    return RestletAccesClass.callService();
    } catch (Exception e) {
    Log.e(TAG, "Error during calling rest server", e);
    return null;
    }
    }
    @Override
    protected void onPostExecute(RestletObjectA result) {
    if (result != null) {
    restlet.setText(result.getName() + ", B : " + result.getObjectB().getName());
    } else {
    restlet.setText("Failure during getting result");
    }
    btnRestlet.setEnabled(true);
    }
    }.execute();


and : 


    

    public static RestletObjectA callService() throws Exception {
    ClientResource clientResource = new ClientResource(TestRpcAndroidActivity.LOCALHOST + "/rest/");

    IRestletService service = clientResource.wrap(IRestletService.class);
    RestletObjectA result = service.getMessage();
    return result;
    }

随着Android项目我总是有以下错误:

With the android project I always have the following error :


01-23 14:09:12.594: E/TestAndroidActivity(1620): Error during calling rest server
01-23 14:09:12.594: E/TestAndroidActivity(1620): Communication Error (1001) - The connector failed to complete the communication with the server
01-23 14:09:12.594: E/TestAndroidActivity(1620):    at org.restlet.resource.ClientResource.doError(ClientResource.java:579)
01-23 14:09:12.594: E/TestAndroidActivity(1620):    at org.restlet.engine.resource.ClientInvocationHandler.invoke(ClientInvocationHandler.java:233)
01-23 14:09:12.594: E/TestAndroidActivity(1620):    at $Proxy5.getMessage(Native Method)
01-23 14:09:12.594: E/TestAndroidActivity(1620):    at com.binomed.android.rpc.rest.RestletAccesClass.callService(RestletAccesClass.java:14)
01-23 14:09:12.594: E/TestAndroidActivity(1620):    at com.binomed.android.rpc.TestRpcAndroidActivity$3.doInBackground(TestRpcAndroidActivity.java:153)
01-23 14:09:12.594: E/TestAndroidActivity(1620):    at com.binomed.android.rpc.TestRpcAndroidActivity$3.doInBackground(TestRpcAndroidActivity.java:1)
01-23 14:09:12.594: E/TestAndroidActivity(1620):    at android.os.AsyncTask$2.call(AsyncTask.java:185)
01-23 14:09:12.594: E/TestAndroidActivity(1620):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
01-23 14:09:12.594: E/TestAndroidActivity(1620):    at java.util.concurrent.FutureTask.run(FutureTask.java:137)
01-23 14:09:12.594: E/TestAndroidActivity(1620):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
01-23 14:09:12.594: E/TestAndroidActivity(1620):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
01-23 14:09:12.594: E/TestAndroidActivity(1620):    at java.lang.Thread.run(Thread.java:1096)

你有没有关于如何解决这个问题的任何想法?

Did you have any idea about how to solve this problem ?

关于

推荐答案

你能尝试添加基于Apache HTTP客户端,而不是内部的那个(是不是完全稳定还)客户端连接器?见说明这里: http://wiki.restlet.org/docs_2 .1 / 13的Restlet / 275的Restlet / 266-restlet.html

Could you try adding the client connector based on Apache HTTP Client instead of the internal one (which isn't fully stable yet)? See instructions here: http://wiki.restlet.org/docs_2.1/13-restlet/275-restlet/266-restlet.html

请注意,我们打算解决这个连接器上的稳定性问题为2.1.0。

Note that we intend to fix the stability issues on this connector for 2.1.0.