vendredi 6 mars 2015

How to test a Java RESTful web service with curl - problems with PUT verb



I'm trying my first Java RESTful web service and probably I don't have clear some mechanisms.


Here an example of my code:



@Path(Paths.USERS)
public class UserService {

private static final String OK_MESSAGE_USERSERVICE_PUT = Messages.OK_MESSAGE_USERSERVICE_PUT;
private Client esClient = ElasticSearch.getClient();

@GET
@Produces(MediaType.APPLICATION_JSON)
public String get(@QueryParam(QParams.ID) String id) {
// TODO Authentication
try {
GetResponse response = esClient
.prepareGet(PRIMARY_INDEX_NAME, USERS_TYPE_NAME, id)
.execute().actionGet();

if (response != null) {
return response.getSourceAsString();
}


}catch (ElasticsearchException e) {
e.printStackTrace();
return e.getMessage();
}
return Messages.RESOURCE_NOT_FOUND;
}

@PUT
@Consumes(MediaType.APPLICATION_JSON)
public String update(@QueryParam(QParams.ID) String id,
@PathParam("metadata") String metadata) {
// TODO Authentication
boolean isMyself = true;

// precondition, the user exsists. If the check fails, you
// should put the isMyself flag at false.
if (isMyself){

esClient
.prepareIndex(PRIMARY_INDEX_NAME, USERS_TYPE_NAME, id)
.setSource(metadata).execute().actionGet();
}

return OK_MESSAGE_USERSERVICE_PUT;
}


My problem is:


How should I pass the metadata to the web service? I tried with



curl -g -X PUT 'http://localhost:8080/geocon/users?id=007&metadata={"name":{"first":"james","last":"bond"}}'


but I encounter an error like



Root Cause: java.net.URISyntaxException: Illegal character in query at index 33: /geocon/users?id=007&metadata=%7B"name":%7B"first":"james","last":"bond"%7D%7D



java.net.URI$Parser.fail(URI.java:2848)

Googling around, I've tried this different solution:


curl -X PUT -H "application/json" -d '{"name":{"first":"james","last":"bond"}}' http://localhost:8080/geocon/users/

but with this approach, I don't know how to pass to the web service my will of updating the user with ID 007 (since, AFAIK, I'm only communicating {"name":{"first":"james","last":"bond"}}).


How would you do? Thanks!




Aucun commentaire:

Enregistrer un commentaire