Модераторы: LSD, powerOn, jk1, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Java restful & Javascript client, Post запрос к java restful из javascript 
V
    Опции темы
Scrolly
Дата 27.9.2011, 08:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 16.3.2006

Репутация: нет
Всего: нет



Разрабатываю restful сервер на java с помощью jersey. Клиент к серверу будет написан на javaScript. Возникли проблемы с выполнением POST запросов.
В качестве ide eclipse-indigo-sr1 и веб контейнер apache tomcat. версия jersey 1.91.
Код java сервера

Код

public class RestfulServer {
    @GET
    @Produces( { MediaType.APPLICATION_JSON })
    @Path("/getUsers")
    public Response Resource1()
    {        
            System.out.println("Invoked: /getUsers");
            LoginInfo lInfo = new LoginInfo();
                            
            lInfo.Login="MyLogin";
            lInfo.Password="MyPassword";            
                        
            return Response.ok(lInfo,MediaType.APPLICATION_JSON)
                    .header("Access-Control-Allow-Origin", "*").build();            
    }    
    @POST
    @Consumes({MediaType.APPLICATION_JSON})    
    @Path("/insertUser")    
    public Response PutUser(LoginInfo lInfo)
    {
        System.out.println("Invoked /insertUser");
        System.out.println("UserName:"+lInfo.Login);
        System.out.println("Password:"+lInfo.Password);
        
        return Response.ok().build();
    }        
}


Класс LoginInfo
Код

@XmlRootElement
public class LoginInfo {

    public String Login;
    public String Password;
        
}


Суть проблемы в том, что я не могу выполнить POST запрос с использованием XMLhttpRequest, выглядит это примерно так
Код

        var url="http://localhost:8080/ru.konalegi.mchange/service/insertUser";
    var req = new XMLHttpRequest();
    var data='{"Login":"MyLogin","Password":"MyPassword"}';
    req.open('POST',url,false);            
    req.setRequestHeader("Content-Type", "application/json");        
    req.send(data);
    document.write(req.responseText);


Причем на стороне Java происходит следующая ошибка. Я пробовал и c xml, результат такой же.

Код

27.09.2011 9:21:56 com.sun.jersey.server.wadl.generators.WadlGeneratorJAXBGrammarGenerator$8 resolve
SEVERE: null
java.lang.IllegalAccessException: Class com.sun.jersey.server.wadl.generators.WadlGeneratorJAXBGrammarGenerator$8 can not access a member of class javax.ws.rs.core.Response with modifiers "protected"
    at sun.reflect.Reflection.ensureMemberAccess(Unknown Source)
    at java.lang.Class.newInstance0(Unknown Source)
    at java.lang.Class.newInstance(Unknown Source)
    at com.sun.jersey.server.wadl.generators.WadlGeneratorJAXBGrammarGenerator$8.resolve(WadlGeneratorJAXBGrammarGenerator.java:467)
    at com.sun.jersey.server.wadl.WadlGenerator$ExternalGrammarDefinition.resolve(WadlGenerator.java:181)
    at com.sun.jersey.server.wadl.ApplicationDescription.resolve(ApplicationDescription.java:81)
    at com.sun.jersey.server.wadl.generators.WadlGeneratorJAXBGrammarGenerator.attachTypes(WadlGeneratorJAXBGrammarGenerator.java:518)
    at com.sun.jersey.server.wadl.WadlBuilder.generate(WadlBuilder.java:124)
    at com.sun.jersey.server.impl.wadl.WadlApplicationContextImpl.getApplication(WadlApplicationContextImpl.java:104)
    at com.sun.jersey.server.impl.wadl.WadlApplicationContextImpl.getApplication(WadlApplicationContextImpl.java:120)
    at com.sun.jersey.server.impl.wadl.WadlMethodFactory$WadlOptionsMethodDispatcher.dispatch(WadlMethodFactory.java:98)
    at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:288)
    at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
    at com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108)
    at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
    at com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84)
    at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1469)
    at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1400)
    at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1349)
    at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1339)
    at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416)
    at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:537)
    at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:708)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:185)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:151)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:269)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:300)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
27.09.2011 9:21:56 com.sun.jersey.server.wadl.generators.WadlGeneratorJAXBGrammarGenerator attachTypes
INFO: Couldn't find JAX-B element for class javax.ws.rs.core.Response


на стороне javascript клиента следующие данные
Заголовок ответа.
Код



HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Allow: OPTIONS,POST
Content-Type: application/vnd.sun.wadl+xml
Content-Length: 486
Date: Tue, 27 Sep 2011 05:21:56 GMT



Заголовок запроса

Код

OPTIONS /ru.konalegi.mchange/service/insertUser HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:5.0.1) Gecko/20100101 Firefox/5.0.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7
Connection: keep-alive
Origin: null
Access-Control-Request-Method: POST
Access-Control-Request-Headers: content-type
Pragma: no-cache
Cache-Control: no-cache


Ну и ошибка клиента

Код

Component returned failure code: 0x80004005 (NS_ERROR_FAILURE)
[Прерывать на этой ошибке] req.send(data); 


Но мне больше всего интересно, то что есть работающий клиент, только с использованием ActiveXObject, но он мне не подходит, поскольку работает только из под ie.
Пример работающего JavaScript клиента

Код

req = new ActiveXObject("MSXML2.XMLHTTP");
req.Open('POST', "http://localhost:8080/ru.konalegi.mchange/service/insertUser", false);
req.setRequestHeader("Content-Type", "application/json");
req.Send('{"Login":"MyLogin","Password":"MyLogin"}');
WScript.echo(req.responseText);



Несколько дней ломаю голову над проблемой :( Подскажите в какую сторону копать?
Заранее спасибо.




PM MAIL ICQ   Вверх
Farmazon
Дата 27.9.2011, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Разработчик
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 7.7.2006

Репутация: нет
Всего: 5



Я с этим ковырялся c jquery...

Короче смотри:

Код

      $.ajax({"url":"../rest/form/doAction/"+actionName, 
                    "data": {"formModel": {p1:"v1", p2:"v2"}},
                    "type":"POST",
                    "contentType":"application/json",
                    "success": function(data) { ...},
                    "error": function(data) { ... }});



Код

    @POST
    @Path("doAction/{action}")
    @Produces(MediaType.TEXT_PLAIN)
    @Consumes({MediaType.APPLICATION_JSON})
    public String doAction(@RequestBody FormModel form, @PathParam("action") String actionName) {...}



Только так у меня получилось отправлять json объекты на сервер.

Добавлено через 3 минуты и 13 секунд
опа-опа!!1.. он у тебя респонс не могёт ни в json ни в xml преобразовать

Добавлено через 3 минуты и 31 секунду
добавь 
@Produces(MediaType.TEXT_PLAIN)


--------------------
Таково моё общее мнение.
PM MAIL WWW   Вверх
Stolzen
Дата 28.9.2011, 08:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1041
Регистрация: 17.10.2005

Репутация: нет
Всего: 48



Цитата(Scrolly @  27.9.2011,  09:32 Найти цитируемый пост)
Суть проблемы в том, что я не могу выполнить POST запрос с использованием XMLhttpRequest, выглядит это примерно так

Используйте js фреймворк, например, jQuery. Многие вещи становятся понятными и приятным - намного приятнее, чем писать кроссбраузерный код для отправки XMLhttpRequest.

В примере Farmazon можно поменять тип запроса на нужный - будь то POST, DELETE или любой другой. И для сложных объектов можно использовать JSON.stringify вот так:

Код

$.ajax({"url":"../rest/form/doAction/"+actionName, 
    "data": JSON.stringify(complexObject);



На стороне сервера все эти данные легко преобразуются в POJO с помощью Jackson. Насчет Jersey не знаю, но думаю что и к нему это прикручивается.


--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
En_t_end
Дата 28.9.2011, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: нет
Всего: 20



Цитата(Stolzen @  28.9.2011,  12:16 Найти цитируемый пост)
На стороне сервера все эти данные легко преобразуются в POJO с помощью Jackson. Насчет Jersey не знаю, но думаю что и к нему это прикручивается. 

Подтверждаю, все работает. Jackson отлично интегрируется в Jersey.
PM MAIL ICQ Skype GTalk Jabber   Вверх
Scrolly
Дата 1.10.2011, 01:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 16.3.2006

Репутация: нет
Всего: нет



Спасибо за ответы.
PM MAIL ICQ   Вверх
Google
  Дата 23.9.2019, 06:20 (ссылка)  





  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Работа с сетью | Следующая тема »


 




[ Время генерации скрипта: 0.0773 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.