-こんにちは、私はこのチュートリアルに従い、Androidアプリから呼び出されたRestlet Webサービス(Objectifyを使用)を介してGoogleAppEngineにデータを保存することができました。
http://www.tutos-android.com/webservice-rest-android-appengine-restlet-objectify
チュートリアルでは、「User」という名前のモデルクラスを使用します。
- User.java
- UserController.java
- UserControllerInterface.java
ここで、「Track」という名前の独自のモデルクラスを使用して、独自のアプリを作成します。
そこで、新しいAndroidプロジェクト、新しいRestlet Serverプロジェクトを作成し、クリーンにするために新しいGoogleEngineアプリを作成しました。
つまり、「ユーザー」ではなく「トラック」を使用することを除いて、チュートリアルと同じコーディングを使用しています。
- Track.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;
}
}
私のトラックサーバー側(念のため、名前以外の余分な属性をすべて削除しました):
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) {
GoogleAppEngineのログには次のように表示されます。
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
インターフェイスでTrackの代わりにStringを使用しようとしましたが、415エラーなしで機能したため、Trackクラスの定義/使用に問題があるはずです。
public interface TrackControllerInterface {
@Put
void create(String trackName);
@Get
Container getAllTracks();
}
-「ユーザー」から「トラック」に「リファクタリング」したときに何を見逃しましたか?
-これらのフレームワークで「415エラー」を修正するには、何を確認する必要がありますか?
415に関する他の質問を探しましたが、この場合のポインタが見つかりません。
よろしくお願いします。