3

私は安らかなサービスについてのチュートリアルに従ってきましたが、それは正常に機能します。しかし、私にはまだよくわからないことがあります。これはそれがどのように見えるかです:

@Path("/hello")
public class Hello {

    // This method is called if TEXT_PLAIN is request
    @GET
    @Produces( MediaType.TEXT_PLAIN )
    public String sayPlainTextHello() 
    {
        return "Plain hello!";
    }

    @GET
    @Produces( MediaType.APPLICATION_JSON )
    public String sayJsonTextHello() 
    {
        return "Json hello!";
    }

    // This method is called if XML is request
    @GET
    @Produces(MediaType.TEXT_XML)
    public String sayXMLHello() {
        return "<?xml version=\"1.0\"?>" + "<hello> Hello Jersey" + "</hello>";
    }

    // This method is called if HTML is request
    @GET
    @Produces(MediaType.TEXT_HTML)
    public String sayHtmlHello() 
    {
        return "<html> " + "<title>" + "Hello fittemil" + "</title>"
                + "<body><h1>" + "Hello!" + "</body></h1>" + "</html> ";
    }
} 

気になるのは、正しい操作ができないことです。ブラウザからサービスをリクエストすると、適切なsayHtmlHello()メソッドが呼び出されます。しかし今、私はJsonで結果を得たいAndroidアプリケーションを開発しています。しかし、アプリケーションからサービスを呼び出すと、MediaType.TEXT_PLAINメソッドが呼び出されます。私のAndroidコードは次のようになります。

androidでHTTPリクエストを作成する

AndroidアプリケーションからMediaType.APPLICATION_JSONを使用するメソッドを呼び出すにはどうすればよいですか?さらに、その特定のメソッドがオブジェクトを返すようにしたいと思います。そこでもいくつかのガイダンスが得られれば素晴らしいと思います。

4

2 に答える 2

4

私は、Jerseyを使用してJava(JAX-RS)でRESTを実装した経験があります。次に、Androidアプリケーションを介してこのRESTfulWebサービスに接続しました。

Androidアプリケーションでは、HTTPクライアントライブラリを使用できます。POST、PUT、DELETE、GETなどのHTTPコマンドをサポートします。たとえば、GETコマンドを使用してJSON形式またはTextPlainでデータを転送するには:

public class Client {

    private String server;

    public Client(String server) {
        this.server = server;
    }

    private String getBase() {
        return server;
    }

    public String getBaseURI(String str) {
        String result = "";
        try {
            HttpParams httpParameters = new BasicHttpParams();
            int timeoutConnection = 3000;
            HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
            int timeoutSocket = 5000;
            HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);
            DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);
            HttpGet getRequest = new HttpGet(getBase() + str);
            getRequest.addHeader("accept", "application/json");
            HttpResponse response = httpClient.execute(getRequest);
            result = getResult(response).toString();
            httpClient.getConnectionManager().shutdown();
        } catch (Exception e) {
            System.out.println(e.getMessage());
        } 
        return result;
    }

    public String getBaseURIText(String str) {
        String result = "";
        try {
            HttpParams httpParameters = new BasicHttpParams();
            int timeoutConnection = 3000;
            HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
            int timeoutSocket = 5000;
            HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);
            DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);
            HttpGet getRequest = new HttpGet(getBase() + str);
            getRequest.addHeader("accept", "text/plain");
            HttpResponse response = httpClient.execute(getRequest);
            result = getResult(response).toString();
            httpClient.getConnectionManager().shutdown();
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        return result;
    }

 private StringBuilder getResult(HttpResponse response) throws IllegalStateException, IOException {
            StringBuilder result = new StringBuilder();
            BufferedReader br = new BufferedReader(new InputStreamReader((response.getEntity().getContent())), 1024);
            String output;
            while ((output = br.readLine()) != null) 
                result.append(output);

            return result;      
      }
}

そして、Androidクラスでは次のことができます。

Client client = new Client("http://localhost:6577/Example/rest/");
String str = client.getBaseURI("Example");    // Json format

JSON文字列(またはxml)を解析し、ListView、GridView、および...で使用します。

あなたが提供したリンクを簡単に調べました。そこには良い点がありました。APIレベル11以上の場合は、ネットワーク接続を別のスレッドに実装する必要があります。このリンクをご覧ください:AndroidのHTTPクライアントAPIレベル11以上

これは、クライアントクラスでHTTPを使用してオブジェクトを投稿する方法です。

public String postBaseURI(String str, String strUrl) {
        String result = "";
        try {
            HttpParams httpParameters = new BasicHttpParams();
            int timeoutConnection = 3000;
            HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
            int timeoutSocket = 5000;
            HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);
            DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);
            HttpPost postRequest = new HttpPost(getBase() + strUrl);
            StringEntity input = new StringEntity(str);
            input.setContentType("application/json");
            postRequest.setEntity(input);
            HttpResponse response = httpClient.execute(postRequest);
            result = getResult(response).toString();
            httpClient.getConnectionManager().shutdown();
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        return result;
    }

そして、REST WSでは、オブジェクトをデータベースに投稿します。

    @POST
    @Path("/post")
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.TEXT_PLAIN)
    public Response addTask(Task task) {        
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        session.save(task);
        session.getTransaction().commit();
        return Response.status(Response.Status.CREATED).build();
    }
于 2012-07-14T00:15:06.157 に答える
1

上記のコードでコメントしました

// This method is called if TEXT_PLAIN is request
@GET
@Produces( MediaType.TEXT_PLAIN )...

@Producesアノテーションは OUTPUT MIME タイプを指定していることに注意してください。INPUT mimetype を指定するには、@Consumes代わりに注釈を使用します。

Jersey アノテーションの詳細については、ブログ投稿を確認してください。

@Consumes – このアノテーションは、リソース クラスのメソッドが受け入れることができるメディア タイプを指定します。これはオプションであり、既定では、コンテナはあらゆるメディア タイプが受け入れられると想定します。この注釈を使用して、クライアントから送信されたリクエストをフィルタリングできます。間違ったメディア タイプのリクエストを受信すると、サーバーはクライアントにエラーをスローします。

@Produces – このアノテーションは、リソース クラスのメソッドが生成できるメディア タイプを定義します。@Consumes アノテーションと同様に、これもオプションであり、コンテナはデフォルトで、任意のメディア タイプをクライアントに送り返すことができると想定しています。

于 2012-07-14T21:19:56.307 に答える