java - Invoking JAX-RS service from a servlet -


i'm working on java web application using eclipse. have created web page servlet asks user choose file upload, , have web service want handle file.

my issue how pass parameters servlet web service, , invoke service servlet.

i have tried methods using context , httpconnections neither seemed have work.

any or advice appreciated!

my code servlet:

protected void dopost(httpservletrequest request,         httpservletresponse response) throws servletexception, ioexception {     httpsession session = request.getsession(false);      string uploadfile = request.getparameter("uploadfile");      string username = (string)session.getattribute("loginname");      url url = new url ("http://localhost:9763/cwengine_1.0.0/services/engine");     httpurlconnection conn = (httpurlconnection) url.openconnection();     conn.setdooutput(true);     conn.setrequestmethod("post");     conn.setrequestproperty("content-type", mediatype.text_plain);      map<string, string> uname = new hashmap<string, string>();      map<string, string> ufile = new hashmap<string, string>();      string output = uname.put("loginname", username) + ufile.put("ufile", uploadfile);      outputstreamwriter os = new outputstreamwriter(conn.getoutputstream());     os.write(output);     os.close(); } 

my code web service:

@path("/") public class engine {  @context private static servletcontext context;  @post @consumes(mediatype.text_plain)      public void main(string[] args) {          url url = null;         httpurlconnection connection = null;          try {             url = new url ("http://localhost:9763/cwengine_1.0.0/services/engine");         } catch (malformedurlexception e1) {             // todo auto-generated catch block             e1.printstacktrace();         }          try {             connection = (httpurlconnection) url.openconnection();         } catch (ioexception e1) {             // todo auto-generated catch block             e1.printstacktrace();         }          bufferedreader input = null;          try {             input = new bufferedreader(new inputstreamreader(connection.getinputstream()));         } catch (ioexception e1) {             // todo auto-generated catch block             e1.printstacktrace();         }          //string output = uname.put("loginname", username) + ufile.put("ufile", uploadfile);          map<string, string> uname = (map<string, string>) ((servletcontext) input).getattribute("uname");         string username = uname.get("loginname");          map<string, string> ufile = (map<string, string>) context.getattribute("ufile");         string uploadfile = ufile.get("ufile");          system.out.println(uploadfile + username); 

you can build rs client in servlet

first, have build rs client

javax.ws.rs.client.client client = clientbuilder.newclient(); 

then point restful service url

webtarget target = client.target("your restful service url"); 

and specify kind of data prefer get, take xml example

builder builder = target.request(mediatype.application_xml); 

and last specify http method, take example

type returnobj = builder.get(type);  

once builder.get(type) executed, return object type "type". "type" must same return type of restful service.

in case, need use

builder.post(entity.entity("your input object", "the media type")); 

i use jersey most, , here official site further reference client api. https://jersey.java.net/documentation/latest/client.html


i'll give simple runnable example

my pom dependency

<dependencies>         <!-- jackson json dependency -->         <dependency>             <groupid>com.fasterxml.jackson.core</groupid>             <artifactid>jackson-core</artifactid>             <version>2.6.5</version>         </dependency>         <dependency>             <groupid>com.fasterxml.jackson.core</groupid>             <artifactid>jackson-databind</artifactid>             <version>2.6.5</version>         </dependency>         <dependency>             <groupid>com.fasterxml.jackson.core</groupid>             <artifactid>jackson-annotations</artifactid>             <version>2.6.5</version>         </dependency>           <!-- jersey dependency -->         <dependency>             <groupid>org.glassfish.jersey.bundles</groupid>             <artifactid>jaxrs-ri</artifactid>             <version>2.21.1</version>         </dependency>          <!-- make jersey auto marshel json -->         <dependency>             <groupid>org.glassfish.jersey.media</groupid>             <artifactid>jersey-media-json-jackson</artifactid>             <version>2.21.1</version>         </dependency>           <!-- make jersey auto marshel xml -->         <dependency>             <groupid>org.glassfish.jersey.media</groupid>             <artifactid>jersey-media-jaxb</artifactid>             <version>2.21.1</version>         </dependency>         <dependency>             <groupid>org.codehaus.woodstox</groupid>             <artifactid>stax2-api</artifactid>             <version>3.1.4</version>         </dependency>     </dependencies> 

my rest config

package com.blithe.rest;  import javax.ws.rs.*; import org.glassfish.jersey.server.*;  @applicationpath("/services") public class restserviceconfig extends resourceconfig {         public restserviceconfig(){              packages("com.blithe.rest","com.blithe.resource");         }  } 

a simple resource

package com.blithe.resource;  import java.util.arraylist; import java.util.list;  import javax.ws.rs.post; import javax.ws.rs.path; import javax.ws.rs.produces; import javax.ws.rs.core.mediatype;  @path("helloworld") public class helloworldresource {         @post     @produces(mediatype.application_json)     public list<string> getstringarray(){          list<string> list = new arraylist<>();         list.add("hello");         list.add("world");         return list;     }      } 

and rs client

package com.blithe.client;  import java.util.list;  import javax.ws.rs.client.client; import javax.ws.rs.client.clientbuilder; import javax.ws.rs.client.invocation.builder; import javax.ws.rs.client.webtarget; import javax.ws.rs.core.generictype; import javax.ws.rs.core.mediatype;  public class rsclient {      public static void main(string [] args){          client client = clientbuilder.newclient();          webtarget target = client.target("http://localhost:8080/restpom/services/helloworld");          builder builder = target.request(mediatype.application_json);          list<string> list  =builder.post(null , new generictype<list<string>>(){});               system.out.println(list.get(0)+list.get(1)); // out put helloworld         }     } 

run project on server publish restful service, , run main() method. should see helloworld on console.

what need is, make rs client in servlet. can refer rsclient above.


Comments

Popular posts from this blog

How to check data type in C++? -

javascript - Is getTimezoneOffset() stable during daylight saving transition? -

sql server - SQL Query returns one result, does not return 0 or NULL result -