Android应用> Restlet + Objectify> Google App Engine =不支持的媒体类型(415) - 不支持的媒体类型

时间:2013-02-16 09:33:30

标签: android google-app-engine restlet objectify

-Hello,我遵循了本教程,并设法通过从Android应用程序调用的Restlet Webservice(使用Objectify)将数据存储在Google App Engine中:

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

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

  • User.java
  • UserController.java
  • UserControllerInterface.java

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

所以我创建了一个新的Android项目,一个新的Restlet Server项目,我创建了一个新的Google Engine应用程序,只是为了清洁。

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

  • Track.java
  • TrackController.java
  • TrackControllerInterface.java

当我通过Android App调用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;
  }
}

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

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应用中的电话:

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 instance = 00c61b117c40b5128fe48b35a014925f9d2f

我尝试在接口中使用String而不是Track,它没有415错误,所以定义/使用Track类一定有问题:

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

    @Get
    Container getAllTracks();
}

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

- 我需要检查以纠正这些框架的“415错误”?

我查找了有关415的其他问题,但找不到针对此案例的任何指示。

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

我想知道你在客户端和服务器端都有哪个扩展来序列化/反序列化你的Track对象... org.restlet.jackson ......我认为这个问题会转变这个方面。

亨利

答案 1 :(得分:0)

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

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

感谢Thierry和Koma回答。