Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Работа с сетью > Java restful & Javascript client


Автор: Scrolly 27.9.2011, 08:32
Разрабатываю 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);



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




Автор: Farmazon 27.9.2011, 15:31
Я с этим ковырялся 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)

Автор: Stolzen 28.9.2011, 08:16
Цитата(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 не знаю, но думаю что и к нему это прикручивается.

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

Подтверждаю, все работает. Jackson отлично интегрируется в Jersey.

Автор: Scrolly 1.10.2011, 01:15
Спасибо за ответы.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)