-Hello,我遵循了本教程,并设法通过从Android应用程序调用的Restlet Webservice(使用Objectify)将数据存储在Google App Engine中:
http://www.tutos-android.com/webservice-rest-android-appengine-restlet-objectify
本教程使用名为“User”的模型类:
现在我想使用我自己的名为“Track”的模型类并构建我自己的应用程序。
所以我创建了一个新的Android项目,一个新的Restlet Server项目,我创建了一个新的Google Engine应用程序,只是为了清洁。
简而言之,除了我使用“Tracks”而不是“Users”之外,我的编码与教程相同:
当我通过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的其他问题,但找不到针对此案例的任何指示。
提前感谢您的帮助。
答案 0 :(得分:0)
我想知道你在客户端和服务器端都有哪个扩展来序列化/反序列化你的Track对象... org.restlet.jackson ......我认为这个问题会转变这个方面。
亨利
答案 1 :(得分:0)
好的,我发现了什么错误:服务器端的“Track”类的包和客户端的“Track”类的包是不同的,导致序列化问题。
当我重构时,我创建了新项目并重新组织了包......
感谢Thierry和Koma回答。