Connecting to Web Service with apache HttpClient
java, rest
Solution
I can not see how you deploy the service.
try change (camel case is unusual for a service)
String uri = "http://localhost:8080/Proctorest/resources/helloWorld";
to lowercase "helloworld"
String uri = "http://localhost:8080/Proctorest/resources/helloworld";
or try
String uri = "http://localhost:8080/helloworld";
HOW TO GET ROUTE
U:...\HelloWorld1\HelloWorld1\web\WEB-INF\sun-web.xml
<sun-web-app error-url="">
<context-root>/HW</context-root>
<class-loader delegate="true"/>
<jsp-config>
<property name="keepgenerated" value="true">
<description>Keep a copy of the generated servlet class' java code.</description>
</property>
</jsp-config>
</sun-web-app>
a) //localhost:8080/HW from `<context-root>/HW</context-root>`
U:...\HelloWorld1\HelloWorld1\web\WEB-INF\web.xml
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<servlet>
<servlet-name>ServletAdaptor</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>ServletAdaptor</servlet-name>
<url-pattern>/hw/*</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
b) //localhost:8080/HW/hw from `<url-pattern>/hw/*</url-pattern>`
U:....\HelloWorld1\HelloWorld1\src\java\helloworld\HelloWorldResource.java
.....
/**
* REST Web Service
*
* @author mkuchtiak
*/
@Stateless
@Path("/helloworld")
public class HelloWorldResource {
....
c) //localhost:8080/HW/hw/helloworld from `@Path("/helloworld")`
put a)b)c) parts from your 3 files together.
Notice: the url Netbeans shows is wrong, only /HW is correct
...
Incrementally deploying HelloWorld1
Completed incremental distribution of HelloWorld1
run-deploy:
Browsing: http://localhost:8080/HW/resources/helloWorld
...
....
public static void demo() throws IOException {
String uri = "http://localhost:8080/HW/hw/helloworld";
HttpClient httpclient = new DefaultHttpClient();
HttpGet httpget = new HttpGet(uri);
HttpResponse response = httpclient.execute(httpget);
System.out.println(response.getStatusLine().toString());
HttpEntity entity = response.getEntity();
System.out.println();
System.out.println(EntityUtils.toString(entity));
}
....
OUTPUT
debug:
HTTP/1.1 200 OK
<html><body><h1>Hello World!</h1></body></html>
Problem
The Appache HTTP Components library seems to work fine for communicating with a regular web site, but is unable to connect to a web service. I am building come components to run inside a Java Desktop application that will communicate with a Web Service-REST using the Jersey framework. The web service is running and I can communicate it with my web browser and with the Test-Web-Service function in netbeans. The client code works fine if I try to read from a regular web page or even the default page for the Glassfish web server running on my machine. Why is it that when I try to reach the web service with my client program (code below) do I get a 404 Not Found error from the web server? ``` import java.io.*; import org.apache.http.*; import org.apache.http.client.*; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.client.methods.*; //HttpHead, HttpPut, HttpGet, etc... import org.apache.http.util.EntityUtils; public class ApacheClientDemo { public static void demo() throws IOException { String uri = "http://localhost:8080/Proctorest/resources/helloWorld"; HttpClient httpclient = new DefaultHttpClient(); HttpGet httpget = new HttpGet(uri); HttpResponse response = httpclient.execute(httpget); System.out.println(response.getStatusLine().toString()); HttpEntity entity = response.getEntity(); System.out.println(); System.out.println(EntityUtils.toString(entity)); } public static void main(String[] args) { try { demo(); } catch(IOException ioe) { System.out.println(ioe); } } } ``` When going to a regular web site on-line or a non-web service site hosted locally, the output is ``` HTTP/1.1 200 OK ``` Followed by the content of the web page. The code above gives me ``` HTTP/1.1 404 Not Found ``` Edit: Below is the code for the web service. The web service code was generated from a Netbeans sample project. ``` /* * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * * Copyright 1997-2010 Oracle and/or its affiliates. All rights reserved. * * Oracle and Java are registered trademarks of Oracle and/or its affiliates. * Other names may be trademarks of their respective owners. * * The contents of this file are subject to the terms of either the GNU * General Public License Version 2 only ("GPL") or the Common * Development and Distribution License("CDDL") (collectively, the * "License"). You may not use this file except in compliance with the * License. You can obtain a copy of the License at * http://www.netbeans.org/cddl-gplv2.html * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the * specific language governing permissions and limitations under the * License. When distributing the software, include this License Header * Notice in each file and include the License file at * nbbuild/licenses/CDDL-GPL-2-CP. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the GPL Version 2 section of the License file that * accompanied this code. If applicable, add the following below the * License Header, with the fields enclosed by brackets [] replaced by * your own identifying information: * "Portions Copyrighted [year] [name of copyright owner]" * * Contributor(s): * * The Original Software is NetBeans. The Initial Developer of the Original * Software is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun * Microsystems, Inc. All Rights Reserved. * * If you wish your version of this file to be governed by only the CDDL * or only the GPL Version 2, indicate your decision by adding * "[Contributor] elects to include this software in this distribution * under the [CDDL or GPL Version 2] license." If you do not indicate a * single choice of license, a recipient has the option to distribute * your version of this file under either the CDDL, the GPL Version 2 or * to extend the choice of license to its licensees as provided above. * However, if you add GPL Version 2 code and therefore, elected the GPL * Version 2 license, then the option applies only if the new code is * made subject to such option by the copyright holder. */ package helloworld; import javax.ejb.EJB; import javax.ejb.Stateless; import javax.ws.rs.Path; import javax.ws.rs.GET; import javax.ws.rs.PUT; import javax.ws.rs.Produces; import javax.ws.rs.Consumes; /** * REST Web Service * * @author mkuchtiak */ @Stateless @Path("/helloWorld") public class HelloWorldResource { @EJB private NameStorageBean nameStorage; /** * Retrieves representation of an instance of helloworld.HelloWorldResource * @return an instance of java.lang.String */ @GET @Produces("text/html") public String getXml() { return "<html><body><h1>Hello "+nameStorage.getName()+"!</h1></body></html>"; } /** * PUT method for updating an instance of HelloWorldResource * @param content representation for the resource * @return an HTTP response with content of the updated or created resource. */ @PUT @Consumes("text/plain") public void putXml(String content) { nameStorage.setName(content); } } /////////// NameStorageBean .java import javax.ejb.Singleton; /** Singleton session bean used to store the name parameter for "/helloWorld" resource * * @author mkuchtiak */ @Singleton public class NameStorageBean { // name field private String name = "World"; public String getName() { return name; } public void setName(String name) { this.name = name; } } ```