1

-こんにちは、私はこのチュートリアルに従い、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に関する他の質問を探しましたが、この場合のポインタが見つかりません。

よろしくお願いします。

4

2 に答える 2

0

OK、何が問題なのかを見つけました。サーバー側の「Track」クラスのパッケージとクライアント側の「Track」クラスのパッケージが異なり、シリアル化の問題が発生していました。

リファクタリングしたときに、新しいプロジェクトを作成し、パッケージを再編成しました...

答えてくれたThierryとKomaに感謝します。

于 2013-02-20T19:18:54.173 に答える
0

Trackオブジェクトをシリアル化/逆シリアル化するためにクライアント側とサーバー側の両方でどちらの拡張機能を使用したのだろうか...org.restlet.jackson...問題はこの側面を好転させると思います。

ティエリー

于 2013-02-19T12:38:54.487 に答える