Java-джерси RESTful веб-сервис запросов

Я следовал учебному пособию об отдыхе, и оно отлично работает. Однако есть кое-что, что я еще не совсем понимаю. Вот как это выглядит:

@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 (). Но сейчас я занимаюсь разработкой приложения для Android, которое я хочу получить в Json. Но когда я вызываю сервис из приложения, вызывается метод MediaType.TEXT_PLAIN. Мой код Android выглядит примерно так:

Сделать HTTP-запрос с Android

Как можно вызвать метод, который использует MediaType.APPLICATION_JSON из моего приложения для Android? Кроме того, я хотел бы, чтобы этот конкретный метод возвращал объект, было бы замечательно, если бы я получил некоторые указания там же.

Ответы на вопрос(2)

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

Обратите внимание, что аннотация@Produces укажите выходной mimetype. Чтобы указать тип ввода INPUT, используйте@Consumes аннотация вместо.

ПроверьтеСообщение блога для больше о аннотациях Джерси:

@Consumes & # x2013; Эта аннотация указывает типы мультимедиа, которые могут принимать методы класса ресурсов. Он является необязательным, и по умолчанию контейнер предполагает, что любой тип мультимедиа приемлем. Эта аннотация может использоваться для фильтрации запросов, отправленных клиентом. При получении запроса с неверным типом носителя, сервер отправляет сообщение об ошибке клиенту.

@Produces & # x2013; Эта аннотация определяет типы носителей, которые могут создавать методы класса ресурсов. Как и аннотация @Consumes, это также необязательно, и по умолчанию контейнер предполагает, что любой тип медиа может быть отправлен обратно клиенту.

 Lucas Arrefelt15 июл. 2012 г., 14:53
Спасибо за разъяснение!
 15 июл. 2012 г., 21:04
Добро пожаловать! Пожалуйста, проверьте символ V, если вы считаете, что это правильный ответ на ваш вопрос :)
 29 авг. 2016 г., 07:48
Я уверен, что вы имеете в виду@Consumes аннотация не@Accept аннотирование
Решение Вопроса

м Джерси. Затем я подключился к этому веб-сервису RESTful через приложение Android.

В вашем приложении для Android вы можете использовать библиотеку HTTP Client. Он поддерживает команды HTTP, такие как POST, PUT, DELETE, GET. Например, чтобы использовать команду 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 или выше. Посмотрите на эту ссылку:HTTP Client API уровня 11 или выше в Android.

Это способ, которым я публикую объект с 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();
    }
 Lucas Arrefelt15 июл. 2012 г., 14:53
Спасибо за ваш вклад! Специально для того, что я искал, была часть addHeader, о которой я не знал

Ваш ответ на вопрос