1

-您好,我按照本教程进行操作,并通过从 Android 应用程序调用的 Restlet Web 服务(使用 Objectify)将数据存储在 Google App Engine 中:

http://www.tutos-android.com/webservice-rest-android-appengine-restlet-objectify

本教程使用名为 "User" 的模型类:

  • 用户.java
  • 用户控制器.java
  • 用户控制器接口.java

现在我想使用我自己的名为“Track”的模型类并构建我自己的应用程序。

所以我创建了一个新的 Android 项目,一个新的 Restlet Server 项目,并创建了一个新的 Google 引擎应用程序,只是为了保持整洁。

简而言之,除了我使用“Tracks”而不是“Users”之外,我的编码与本教程相同:

  • 轨道.java
  • TrackController.java
  • TrackControllerInterface.java

当我通过 Android 应用调用 create 方法时,我得到一个: “不支持的媒体类型 (415) - 不支持的媒体类型”

我的界面:

public interface TrackControllerInterface {
    @Put
    void create(Track track);

    @Get
    Container getAllTracks();
}

我的 RestletDispatch :

public class RestletDispatch extends Application
{
  @Override
  public synchronized Restlet createInboundRoot()
  {
    final Router router = new Router(getContext());
    router.attach("/track", TrackController.class);
    return router;
  }
}

我的 Track 服务器端(我删除了除了名称之外的所有额外属性):

public class Track implements Serializable {

    private static final long serialVersionUID = 2028908999105872121L;

    @Id
    private Long id;
    private String name;

    public Track() {

    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

我的 TrackController 服务器端:

import static com.restlet.pcn.vttracks.server.OfyService.ofy;

public class TrackController extends ServerResource implements
    TrackControllerInterface {

    public TrackController() {
    }

    @Override
    public void create(Track track) {
        Track tk = new Track();
        tk.setName(track.getName());
        ofy().put(tk);
    }

    @Override
    public Container getAllTracks() {
        Container content = null;
        List tracks = new ArrayList();

        Query<Track> qTracks = ofy().query(Track.class);

        for (Track track : qTracks){
            tracks.add(track);
        }
        content = new Container();
        content.setTrack_list(tracks);

        return content;
    }
}

Android App 中的调用:

EditText name = (EditText) findViewById(R.id.track_create_name);
Track track = new Track();
track.setName(name.getText().toString());
final TrackController tc = new TrackController();
try {
    tc.create(track);
} catch (Exception e) {

在 Google App Engine 的日志中,我看到:

93.0.180.137 - - [16/Feb/2013:00:46:07 -0800] “PUT /rest/track HTTP/1.1” 415 546 - “Restlet-Framework/2.0rc4” “vttracks-app-test2.appspot。 com" ms=1407 cpu_ms=1027 cpm_usd=0.000061 实例=00c61b117c40b5128fe48b35a014925f9d2f

我尝试在界面中使用 String 而不是 Track 并且它在没有 415 错误的情况下工作,因此 Track 类的定义/使用一定存在问题:

public interface TrackControllerInterface {
    @Put
    void create(String trackName);

    @Get
    Container getAllTracks();
}

- 当我从“用户”“重构”到“跟踪”时,我错过了什么?

- 我必须检查什么来纠正这些框架的“415 错误”?

我寻找了关于 415 的其他问题,但找不到任何关于这个案例的指针。

在此先感谢您的帮助。

4

2 回答 2

0

我想知道您在客户端和服务器端都使用了哪个扩展来序列化/反序列化您的 Track 对象... org.restlet.jackson... 我认为问题围绕着这个方面。

蒂埃里

于 2013-02-19T12:38:54.487 回答
0

好的,我发现了问题所在:服务器端的“Track”类的包和客户端的“Track”类的包不同,导致序列化问题。

当我重构时,我创建了新项目并重新组织了包......

感谢蒂埃里和科马的回答。

于 2013-02-20T19:18:54.173 回答