Java Jersey PUT方法和工作客户端

4
我正在使用Eclipse开发动态Web应用程序。我有一个工作的MySQL数据库,通过名为“数据访问对象”(=DAO)的类连接到JDBC。我想在这个数据库中创建条目。这些功能已经准备好了,我的意思是测试过并且OK。在同一个应用程序中,我实现了Java Jersey的RESTful WebService。它运行良好,我可以调用该服务并返回所需的信息。但现在我的问题是:
如何发送包含XML的字符串?该字符串必须在WebMethod中进行解析以构建和执行查询。
我的WebService如下所示:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import javax.ws.rs.Consumes;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.core.MediaType;

@Path("/input")
public class Input {
    //DAO instance to have connection to the database.
    //Not used yet.
    //private DAO dao = new DAO();

    @PUT
    @Consumes(MediaType.TEXT_XML)
    @Path("/result")
    public void putIntoDAO(InputStream xml) {
        String line = "";
        StringBuilder sb = new  StringBuilder();
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(xml));
            while ((line = br.readLine()) != null) {
                sb.append(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println(sb.toString());
    }
}

正如您所见,我试图将传入的流打印到控制台上。 我重申一些最重要的事情:

  • 我知道如何解析XML。
  • 我知道我的DAO正常工作。
  • 我也知道我的WebService正常工作。

我想知道的是:

  • 如何将XML字符串发送到我的WebService?
  • 如何在我的PUT方法中访问此字符串?

感谢您的关注和帮助。我甚至感激每一次尝试。

此致敬礼

L.

2个回答

2

我如何在PUT方法中访问这个字符串?

你可以简单地编写一个接受String类型参数的方法,Jersey会将其从传入的XML请求中映射出来,所以:

@PUT
@Consumes(MediaType.TEXT_XML)
@Path("/result")
public void putIntoDAO(String xml) {
    // ...
}

这个应该能行,只需用包含完整请求体的字符串即可。

我怎样将 XML 字符串发送到我的 WebService?

这取决于您用来发送请求到服务的工具,可能是任何通过 HTTP 通信的工具。如果您使用 Java 并选择 Jersey,您可以按照以下方式使用 Jersey 客户端:

Client client = Client.create();
WebResource webResource = client.resource("http://localhost:8080/input/result");
String input = "<xml></xml>";
ClientResponse response = webResource
    .type("application/xml")
    .put(ClientResponse.class, input);

请查看Jersey客户端文档了解更多信息。

谢谢@Ross Turner!终于可以工作了!我还尝试了Apache HttpComponents,也能正常工作。我会在你的回答下面发布示例。 - silenum

2

Ross Turner所发布的答案完全正确并且可行。这里提供一种使用Apache HttpComponents的选项。

import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;

public class Runner {

    public static void main(String[] args) {
        try {

            HttpClient httpClient = new DefaultHttpClient();
            HttpPut putRequest = new HttpPut("http://localhost:8080/HelloFromJersey/input/result");

            StringEntity input = new StringEntity("Hello, this is a message from your put client!");
            input.setContentType("text/xml");
            putRequest.setEntity(input);

            httpClient.execute(putRequest);
            httpClient.getConnectionManager().shutdown();


        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

服务器输出:
Hello, this is a message from your put client!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接