Читать заголовки постов http - PullRequest
6 голосов
/ 13 марта 2012

Привет, у меня возникли проблемы. Я пытаюсь изучить успокаивающие сервисы. Я создал веб-сервис, используя jax-rs, который показан ниже

@Path("/users")
public class Welcome {
@POST
@Consumes("text/xml")
@Produces("text/xml") 
public Response welcome(String incomingXML){
return Response.status(200).entity("timestamp : " + incomingXML).build();
}
}

Я использую следующий тестовый клиент для тестирования службы

public class TestService {
public static void main(String args[]) throws ParserConfigurationException, SAXException, IOException {
ClientConfig config = new DefaultClientConfig();
Client client=Client.create(config);
WebResource service=client.resource(getBaseURI());
String urlString = "http://localhost:8080/JaXRSDemo/rest/users";
URL url = new URL( urlString );
HttpURLConnection con = (HttpURLConnection) url.openConnection();

// set up url connection to get retrieve information back
con.setRequestMethod( "POST" );
con.setDoInput( true );

// stuff the Authorization request header
byte[] encodedPassword = ( userName + ":" + password ).getBytes();

con.setRequestProperty( "Authorization",encodedPassword.toString() );
Customer customer=new Customer();
customer.setName("noobstre");
customer.setPin(123455);

ClientResponse response=service.path("rest").path("users").type(MediaType.APPLICATION_XML).post(ClientResponse.class,customer);
System.out.println(" response " + response.getEntity(String.class));
}
private static URI getBaseURI() {
return UriBuilder.fromUri("http://localhost:8080/JaXRSDemo").build();
}
}

Я хочу использовать пароль в заголовке на стороне сервера и выполнить поиск в базе данных. Проблема, с которой я сталкиваюсь, заключается в том, как читать заголовки на сервере.

Ответы [ 2 ]

12 голосов
/ 13 марта 2012

Я не очень знаком с Jax-RS, но вы можете использовать следующие методы, чтобы получить информацию заголовка, которую вы ищете:

1.) Используйте @ HeaderParam

/**Server side******/ 
@Path("/users") 
public class Welcome { 

    @POST 
    @Consumes("text/xml") 
    @Produces("text/xml") 
    public Response welcome(String incomingXML, @HeaderParam("Authorization") String authString)
    {
        //Use authString here
        return Response.status(200).entity("timestamp : " + incomingXML).build(); 
    }
}

2.) Используйте @ Context

/**Server side******/ 
@Path("/users") 
public class Welcome { 

    @POST 
    @Consumes("text/xml") 
    @Produces("text/xml") 
    public Response welcome(String incomingXML, @Context HttpHeaders headers)
    {
        //Get Authorization Header
        String authString = headers.getRequestHeader("Authorization").get(0);

        return Response.status(200).entity("timestamp : " + incomingXML).build(); 
    }
}

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

7 голосов
/ 14 марта 2012

Я решил это с помощью Jersey Client

// * 1003 клиентских *

    ClientConfig config = new DefaultClientConfig();
    Client client = Client.create(config);
    final String userName = "admin";
    final String password = "admin";
    String cred = userName + ":" + password;
    WebResource service = client.resource(getBaseURI());

    Customer customer = new Customer();
    customer.setName("noob");
    customer.setPin(123455);
    ClientResponse response = service.path("rest").path("users")
            .accept(MediaType.APPLICATION_XML)
            .header("Authorization", cred)
            .post(ClientResponse.class, customer);

    System.out.println(" response " + response.getEntity(String.class));

На стороне сервера

@Path("/users")
public class Welcome {

@POST
@Consumes(MediaType.APPLICATION_XML)
@Produces(MediaType.APPLICATION_XML)
public Response welcome(String incomingXML, @Context HttpHeaders headers) {

    String s = headers.getRequestHeaders().getFirst("authorization");

    return Response.status(200).entity("timestamp : " + incomingXML + s)
            .build();
}

}

...