Как использовать клиентскую среду RESTEasy для отправки данных в POST - PullRequest
8 голосов
/ 21 мая 2010

Я использую клиентскую среду RESTEasy для вызова веб-службы RESTful. Вызов осуществляется через POST и отправляет некоторые данные XML на сервер. Как мне это сделать?

Какое волшебное заклинание использовать, чтобы это произошло?

Ответы [ 4 ]

12 голосов
/ 01 июня 2010

Я думаю, что Дэвид имеет в виду RESTeasy "Client Framework". Таким образом, ваш ответ (Riduidel) не совсем то, что он ищет. Ваше решение использует HttpUrlConnection в качестве http-клиента. Использование клиента resteasy вместо HttpUrlConnection или DefaultHttpClient выгодно, потому что клиент resteasy поддерживает JAX-RS. Чтобы использовать клиент RESTeasy, вы создаете объекты org.jboss.resteasy.client.ClientRequest и создаете запросы, используя его конструкторы и методы. Ниже я расскажу, как реализовать вопрос Дэвида, используя клиентскую среду от RESTeasy.

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();

Надеюсь, это поможет, Charlie

4 голосов
/ 08 февраля 2013

Это так же просто, как после

    @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());
    }
0 голосов
/ 13 января 2017

У меня возникли проблемы с выяснением, как это сделать, поэтому я решил опубликовать это здесь. Использовать механизм прокси-клиента RESTeasy на самом деле очень просто.

Как предлагает Чарльз Акалугву, этот подход позволяет вам создать единый интерфейс 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 Client Framework для отправки данных в 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-интерфейс только для клиента.

0 голосов
/ 21 мая 2010

Я позаимствовал из этого примера: Создайте restful-сервис с помощью RESTEasy следующего фрагмента кода, который, кажется, делает именно то, что вы хотите, нет?

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();  
...