9

我正在使用 RESTEasy 客户端框架来调用 RESTful Web 服务。该调用是通过 POST 进行的,并将一些 XML 数据发送到服务器。我该如何做到这一点?

用来实现这一点的注释的神奇咒语是什么?

4

5 回答 5

13

我认为大卫指的是 RESTeasy“客户端框架”。因此,您的答案(Riduidel)并不是他特别想要的。您的解决方案使用 HttpUrlConnection 作为 http 客户端。使用 resteasy 客户端而不是 HttpUrlConnection 或 DefaultHttpClient 是有益的,因为 resteasy 客户端是 JAX-RS 感知的。要使用 RESTeasy 客户端,您需要构造 org.jboss.resteasy.client.ClientRequest 对象并使用其构造函数和方法构建请求。下面是我如何使用来自 RESTeasy 的客户端框架来实现 David 的问题。

ClientRequest request = new ClientRequest("http://url/resource/{id}");

StringBuilder sb = new StringBuilder();
sb.append("<user id=\"0\">");
sb.append("   <username>Test User</username>");
sb.append("   <email>test.user@test.com</email>");
sb.append("</user>");


String xmltext = sb.toString();

request.accept("application/xml").pathParameter("id", 1).body( MediaType.APPLICATION_XML, xmltext);

String response = request.postTarget( String.class); //get response and automatically unmarshall to a string.

//or

ClientResponse<String> response = request.post();

希望这会有所帮助,查理

于 2010-06-01T09:01:27.310 回答
5

就像以下一样简单

    @Test
    public void testPost() throws Exception {
        final ClientRequest clientCreateRequest = new ClientRequest("http://localhost:9090/variables");
        final MultivaluedMap<String, String> formParameters = clientCreateRequest.getFormParameters();
        final String name = "postVariable";
        formParameters.putSingle("name", name);
        formParameters.putSingle("type", "String");
        formParameters.putSingle("units", "units");
        formParameters.putSingle("description", "description");
        formParameters.putSingle("core", "true");
        final ClientResponse<String> clientCreateResponse = clientCreateRequest.post(String.class);
        assertEquals(201, clientCreateResponse.getStatus());
    }
于 2013-02-08T14:21:24.233 回答
2

试试这个语法:

Form form = new Form();
form
 .param("client_id", "Test_Client")
 .param("grant_type", "password")
 .param("response_type", "code")
 .param("scope", "openid")
 .param("redirect_uri", "some_redirect_url");
Entity<Form> entity = Entity.form(form);
    
ResteasyClient client = new ResteasyClientBuilder().build();
ResteasyWebTarget target = client.target("http://localhost:8080/auth/realms");
Response response = target
 .request(MediaType.APPLICATION_JSON)
 .header(HttpHeaders.AUTHORIZATION, authCreds)
 .post(entity);

System.out.println("HTTP code: " + response.getStatus());
于 2020-04-09T11:08:18.960 回答
1

我在弄清楚如何做到这一点时遇到了一些麻烦,所以我想我会把它贴在这里。使用 RESTeasy 代理客户端机制其实非常简单。

正如 Charles Akalugwu 所建议的那样,这种方法允许您创建一个可在客户端和服务器端使用的单一 Java 接口,并生成明显且易于使用的客户端和服务器端代码。

首先,为服务声明一个 Java 接口。这将在客户端和服务器端使用,并且应该包含所有 JAX-RS 声明:

@Path("/path/to/service")
public interface UploadService
{
  @POST
  @Consumes("text/plan")
  public Response uploadFile(InputStream inputStream);
}

接下来,编写一个实现该接口的服务器。它看起来很简单:

public class UploadServer extends Application implements UploadService
{
  @Override
  public Response uploadFile(InputStream inputStream)
  {
    // The inputStream contains the POST data
    InputStream.read(...);

    // Return the location of the new resource to the client:
    Response.created(new URI(location)).build();
  }
}

要回答“如何使用 RESTEasy 客户端框架在 POST 中发送数据”这个问题,您所要做的就是通过 RESTeasy 代理从客户端调用服务接口,RESTeasy 将为您完成 POST。创建客户端代理:

Client client = ClientBuilder.newClient();
WebTarget target = client.target("http://path/to/service");
ResteasyWebTarget rtarget = (ResteasyWebTarget)target;
UploadService uploadService = rtarget.proxy(UploadService.class);

将数据发布到服务:

InputStream inputStream = new FileInputStream("/tmp/myfile");
uploadService.uploadFile(inputStream);

当然,如果您正在写入现有的 REST 服务,那么您可以通过仅为客户端编写 Java 接口来解决问题。

于 2017-01-13T08:52:47.870 回答
0

我从这个例子中借用:使用 RESTEasy 构建 restful 服务下面的代码片段,这似乎完全符合你的要求,不是吗?

URL url = new URL("http://localhost:8081/user");
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "application/xml");
connection.setDoOutput(true);
connection.setInstanceFollowRedirects(false);

StringBuffer sbuffer = new StringBuffer();
sbuffer.append("<user id=\"0\">");
sbuffer.append("   <username>Test User</username>");
sbuffer.append("   <email>test.user@test.com</email>");
sbuffer.append("</user>");

OutputStream os = connection.getOutputStream();
os.write(sbuffer.toString().getBytes());
os.flush();

assertEquals(HttpURLConnection.HTTP_CREATED, connection.getResponseCode());
connection.disconnect();  
于 2010-05-21T07:47:39.777 回答