2016-12-22 6 views
1

Предположим, у меня есть HTML-страница, и я запускаю back-end на java, и я хочу сделать простой вызов запроса ajax.Ловить запрос запроса в java

например

fetch('localhost:8080/testResponse) 
.then(function(response) { 
    return response.json(); 
}) 

и на моем Java-сервере У меня есть

@Path('testResponse') 
public class NewClass { 
    private String name = "MyName"; 
    private String age = "MyAge"; 
    @GET 
    public String getName(){ 
     return this.name; 
    } 
    @GET 
    public String getAge(){ 
     return this.age; 
    } 
} 

Так в основном есть получить запрос к/testResponse и Path аннотацию указывает, какой класс должен поймать его, но как я могу выбрать какой метод вызывается и возвращает данные? Какова логика этого? Я ничего не могу с этим поделать.

/////////////////////////////////

Зв Я создал новый веб-проект в netbeans. Он сгенерировал html-файл, я добавил только базовый вызов ajax на сервер.

<html> 
    <head> 
     <title>TODO supply a title</title> 
     <meta charset="UTF-8"> 
     <meta name="viewport" content="width=device-width, initial-scale=1.0"> 
    </head> 
    <body> 
     <div>TODO write content</div> 
     <script> 
      fetch('/ajax_test/testResponse/name').then(function(x){ 
       alert(JSON.stringify(x)); 
      }) 
     </script> 
    </body> 
</html> 

Когда я бегу он это показывает на локальном хосте: 8080/ajax_test

Я создал файл по комментариям здесь например

@Path("/ajax_test") 
public class testik { 
    private String name = "MyName"; 
    private String age = "MyAge"; 
    @GET 
    @Path("/name") 
    public String getName(){ 
     return this.name; 
    } 
    @GET 
    @Path("/age") 
    public String getAge(){ 
     return this.age; 
    } 
} 

Но его до сих пор 404 же я что-то пропустила? Еще раз спасибо за помощь

+1

Что происходит, когда вы проверяете его? Как вы думаете, что должно произойти в этом случае? –

+0

Я просто не привык к тому, что у меня есть методы для этого. Я привык ловить запрос и возвращать его с помощью маршрута. Теперь у меня есть два метода, которые возвращают различное значение и находятся на одном маршруте. – Johnyb

+0

Это не отвечает ни на один из моих вопросов. –

ответ

1

SImply используйте @Path для дальнейшего определения конечной точки. Так что если вы хотите «URL префикс/testResponse/имя» и «URL префикс/testResponse/возраст», то сделайте следующее:

@Path("/testResponse") 
public class NewClass { 
    private String name = "MyName"; 
    private String age = "MyAge"; 
    @GET 
    @Path("/name") 
    public String getName(){ 
     return this.name; 
    } 
    @GET 
    @Path("/age") 
    public String getAge(){ 
     return this.age; 
    } 
+0

спасибо ! i обновленный qeuestion for furhter confusion – Johnyb

0

Если я вас правильно понял, то вы хотите, чтобы вызвать один из GET методов при вы ударили testResponse. Вам разрешено комментировать ваши методы с @Path, как это:

@Path("/") 
public class NewClass { 
    private String name = "MyName"; 
    private String age = "MyAge"; 

    @GET 
    @Path("/testSomething") 
    public String getName(){ 
     return this.name; 
    } 

    @GET 
    @Path("/testResponse") 
    public String getAge(){ 
     return this.age; 
    } 
} 
+0

спасибо! i updated qeuestion for furhter confusion – Johnyb

+1

@Johnyb Почему вы говорите ** '/ ajax_test/testResponse/name' ** в вашей функции 'fetch()'? Разве это не просто ** '/ ajax_test/name' **? – user2004685

1

первый соответствующий метод для вашего ресурса /testResponse и его аннотации будут называться в вашем случае getName(). Вы можете добавить дополнительные аннотации, чтобы специализироваться ваши методы:

  • @Consumes: Определяет типы MIME медиа для вашего запроса, как application/json
  • @Produces: Что MIME медиа тип данных вы возвращаете имеет. Этот атрибут соответствует заголовку Accept, который вы отправили.
  • @Path: Дополнительный путь к вашему ресурсу.

В вашем случае getName() всегда будет вызываться, потому что он является первым в очереди, и нет других аннотаций, которые еще больше дифференцируют оба метода. Кроме того, поскольку вы используете REST ресурсы, каждый ресурс должен иметь уникальный путь, чтобы вы могли определить subresources для name и age, как это:

@Path('testResponse') 
public class NewClass { 
    private String name = "MyName"; 
    private String age = "MyAge"; 

    @GET 
    @Path("/name") 
    public String getName(){ 
     return this.name; 
    } 

    @GET 
    @Path("/age") 
    public String getAge(){ 
     return this.age; 
    } 
} 

Ваши ресурсы будут доступны на /testResponse/name и /testResponse/age.

Посмотрите на следующий пример. Здесь оба метода имеют один и тот же путь, а именно /testResponse, однако фактический метод, который будет вызываться, выбирается заголовком Content-Type, который вы отправили в своем запросе Ajax. Если вы установили Content-Type: application/json, вызывается getJsonName() и аналогично для XML и getXmlName().

@Path('testResponse') 
public class NewClass { 
    private String name = "MyName"; 
    private String age = "MyAge"; 

    @GET 
    @Consumes("application/json") 
    public String getJsonName(){ 
     return this.name; 
    } 

    @GET 
    @Consumes("application/xml") 
    public String getXmlName(){ 
     return this.name; 
    } 
} 

Вы можете комбинировать это с другими примечаниями, упомянутыми выше. Вызываемый метод всегда является первым, который соответствует вашим путям ресурсов и атрибутам заголовка запроса с предоставленными аннотациями.

+0

спасибо! i updated qeuestion for furhter confusion – Johnyb

+0

Я думаю, вы пропустили отображаемое имя проекта или сервлета в своем пути, попробуйте 'localhost: 8080/DISPLAY_NAME_GOES_HERE/ajax_test'. Вы можете найти отображаемое имя в * дескрипторе развертывания * файла 'web.xml' в каталоге WEB-INF. – thatguy

+0

Я ничего не могу найти в этом файле, который бы помог – Johnyb

 Смежные вопросы

  • Нет связанных вопросов^_^