Search code examples
jerseyhttp-postauthorizationjersey-client

Jersey REST client post with authorization


I am using Jersey 1.9 in my Java Spring MVC web application. I am trying to make a post request for which I have to set two header values - authorization and content type. I was able to successfully make the post using postman REST client. I have tried many solutions found online, but the response I get is 401-Authorization failed. Following is the code is the code I use:

ClientConfig config = new DefaultClientConfig();
   Client client = Client.create(config);
WebResource webResource = client.resource("https://api.constantcontact.com/v2/contacts?action_by=ACTION_BY_OWNER&api_key=tntkzy2drrmbwnhdv12s36vq");
WebResource.Builder builder = webResource.type(MediaType.APPLICATION_JSON);
builder.header(HttpHeaders.AUTHORIZATION, "Bearer 28ac08bc-58d5-426e-b811-3b1d1e505a9b");
ClientResponse responseMsg = webResource
     .post(ClientResponse.class, jsonString);
  responseMsg.getEntity(String.class);

Adding the postman screenshot: enter image description here


Solution

  • After some research, I finally found what was missing in my case, based on the suggestions I got from the comments, I removed the query params from URL and added them as query params. ANd then added all query params to a multivalued map and used this multivalued map as the query param. My code was modified as follows:

    MultivaluedMap<String, String> queryParams = new MultivaluedMapImpl();
    queryParams.add("action_by", "ACTION_BY_OWNER");
    queryParams.add("api_key", apiKey);
    WebResource webResource = client.resource(url);
    ClientResponse responseMsg = webResource
    .queryParams(queryParams)
    .header("Content-Type", "application/json;charset=UTF-8")
    .header("Authorization", "Bearer "+authorisationToken.trim())
    .post(ClientResponse.class, jsonString);
    responseMsg.getEntity(String.class);
    

    Somehow when there are multiple query params, adding headers was not working, but when the params were added as a single multivalued map, everything works. Hope this helps someone.