Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用apache HttpClient连接到Web服务_Java_Rest - Fatal编程技术网

Java 使用apache HttpClient连接到Web服务

Java 使用apache HttpClient连接到Web服务,java,rest,Java,Rest,该库似乎可以很好地与常规网站通信,但无法连接到web服务 我正在构建运行在Java桌面应用程序中的come组件,该应用程序将使用Jersey框架与Web服务REST通信。web服务正在运行,我可以与我的web浏览器和netbeans中的测试web服务功能进行通信 如果我尝试从一个常规网页,甚至是运行在我机器上的Glassfish web服务器的默认网页中读取,那么客户端代码就可以正常工作。 为什么当我尝试使用客户端程序(下面的代码)访问web服务时,会从web服务器收到404 Not Found

该库似乎可以很好地与常规网站通信,但无法连接到web服务

我正在构建运行在Java桌面应用程序中的come组件,该应用程序将使用Jersey框架与Web服务REST通信。web服务正在运行,我可以与我的web浏览器和netbeans中的测试web服务功能进行通信

如果我尝试从一个常规网页,甚至是运行在我机器上的Glassfish web服务器的默认网页中读取,那么客户端代码就可以正常工作。 为什么当我尝试使用客户端程序(下面的代码)访问web服务时,会从web服务器收到404 Not Found错误

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);
    }
  }
}
当转到联机的常规web站点或本地托管的非web服务站点时,输出为

 HTTP/1.1 200 OK
其次是网页的内容

上面的代码给了我

  HTTP/1.1 404 Not Found

编辑:下面是web服务的代码。 web服务代码是从Netbeans示例项目生成的。

/*
*请勿更改或删除版权声明或此标题。
*
*版权所有1997-2010 Oracle和/或其附属公司。版权所有。
*
*Oracle和Java是Oracle和/或其附属公司的注册商标。
*其他名称可能是其各自所有者的商标。
*
*本文件的内容受GNU或
*仅通用公共许可证版本2(“GPL”)或通用
*开发和分销许可证(“CDDL”)(统称为
*“许可证”)。除非符合以下要求,否则不得使用此文件:
*执照。您可以在以下位置获得许可证副本:
* http://www.netbeans.org/cddl-gplv2.html
*或nbbuild/licenses/CDDL-GPL-2-CP。有关详细信息,请参阅许可证
*管理下的权限和限制的特定语言
*执照。分发软件时,请包含此许可证标题
*请注意,每个文件中都包含许可证文件
*nbbuild/licenses/CDDL-GPL-2-CP。Oracle指定此
*特定文件作为“类路径”异常的主体
*由Oracle在许可证文件的GPL版本2部分
*伴随着这个代码。如果适用,请在下面添加以下内容:
*许可证标题,括号[]内的字段替换为
*您自己的身份信息:
*“版权部分[年份][版权所有人姓名]”
* 
*投稿人:
* 
*最初的软件是NetBeans。最初的开发者
*软件为Sun Microsystems,Inc.版权所有1997-2007 Sun
*Microsystems,Inc.版权所有。
* 
*如果您希望此文件的版本仅由CDDL管理
*或者只有GPL版本2,通过添加
*“[Contributor]选择将此软件包括在此发行版中
*在[CDDL或GPL版本2]许可证下。”如果您未指明
*单一许可选择,收件人可以选择分发
*您在CDDL、GPL版本2或
*按照上述规定,将许可证的选择范围扩大到其被许可人。
*但是,如果您添加了GPL版本2代码,因此选择了GPL
*版本2许可证,则该选项仅在新代码为
*受版权持有人的此类选择的约束。
*/
包helloworld;
导入javax.ejb.ejb;
导入javax.ejb.Stateless;
导入javax.ws.rs.Path;
导入javax.ws.rs.GET;
导入javax.ws.rs.PUT;
导入javax.ws.rs.products;
导入javax.ws.rs.Consumes;
/**
*RESTWeb服务
*
*@author mkuchtiak
*/
@无国籍
@路径(“/helloWorld”)
公共类HelloWorldResource{
@EJB
私有名称存储bean名称存储;
/**
*检索helloworld.HelloWorldResource实例的表示形式
*@返回java.lang.String实例
*/
@得到
@生成(“文本/html”)
公共字符串getXml(){
返回“Hello”+nameStorage.getName()+“!”;
}
/**
*更新HelloWorldResource实例的PUT方法
*@param资源的内容表示形式
*@返回包含更新或创建的资源内容的HTTP响应。
*/
@放
@消耗(“文本/普通”)
公共void putXml(字符串内容){
名称存储.setName(内容);
}
}
///////////java
导入javax.ejb.Singleton;
/**用于存储“/helloWorld”资源的名称参数的单例会话bean
*
*@author mkuchtiak
*/
@独生子女
公共类名称存储bean{
//名称字段
私有字符串name=“World”;
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
}

我看不出您是如何部署该服务的

尝试更改(驼峰案例对于服务来说是不常见的)

改为小写的“helloworld”

或尝试

String uri = "http://localhost:8080/helloworld";
如何获得路线

U:…\HelloWorld1\HelloWorld1\web\web-INF\sunweb.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>
<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>
c) //本地主机:8080/HW/HW/helloworld来自
@Path(“/helloworld”)

将3个文件中的a)b)c)部分放在一起

注意:Netbeans显示的url是错误的,只有/HW是正确的

...
    Incrementally deploying HelloWorld1
    Completed incremental distribution of HelloWorld1
    run-deploy:
    Browsing: http://localhost:8080/HW/resources/helloWorld
...

输出

debug:
HTTP/1.1 200 OK

<html><body><h1>Hello World!</h1></body></html>
调试: HTTP/1.1200ok 你好,世界!
输入
http://localhost:8080/Proctorest/resources/helloWorld
从您的web浏览器或使用
curl
/
wget
?由于helloWorld资源实现了@get方法,web浏览器为我提供了我期望的页面。这才是真正的问题。为什么glassfish会响应web浏览器请求,而不是Java客户端请求?我正在从Netbeans向glassfish部署服务。这是一个可以通过新建项目向导创建的演示应用程序,我向它添加了一些adfitional资源,但在上面的代码中,我只是测试演示附带的资源。URI的拼写不是问题所在;我检查了@resource注释的拼写和大小写,我的web浏览器可以很好地访问URI。
<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>
.....
/**
 * REST Web Service
 *
 * @author mkuchtiak
 */

@Stateless
@Path("/helloworld")
public class HelloWorldResource {
....
...
    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));       
  }
....
debug:
HTTP/1.1 200 OK

<html><body><h1>Hello World!</h1></body></html>