How to pass custom object in Post method of Restfull webservice - java

I have a requirement to recive some field value at webservice end which is passed by client in a custom object through Post call but its causes error like -
org.jboss.resteasy.client.ClientResponseFailure: Unable to find a MessageBodyReader of content-type text/html;charset="utf-8" and type null
at org.jboss.resteasy.client.core.BaseClientResponse.createResponseFailure(BaseClientResponse.java:522)
at org.jboss.resteasy.client.core.BaseClientResponse.createResponseFailure(BaseClientResponse.java:513)
at org.jboss.resteasy.client.core.BaseClientResponse.readFrom(BaseClientResponse.java:414)
at org.jboss.resteasy.client.core.BaseClientResponse.getEntity(BaseClientResponse.java:376)
at org.jboss.resteasy.client.core.BaseClientResponse.getEntity(BaseClientResponse.java:337)
at com.rest.jso.mainclient.RestJsonClient.processPOSTRequest(RestJsonClient.java:49)
at com.rest.jso.mainclient.RestJsonClient.main(RestJsonClient.java:33)
My webservice looks like -
#POST
#Path("/update/{user}")
#Produces("application/json")
public Response updateRecord(#PathParam("user")String user) {
User result = null;
//User result = new User();
try {
result = new ObjectMapper().readValue(user, User.class);
} catch (JsonParseException e) {
e.printStackTrace();
} catch (JsonMappingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
result.setName("Ram");
return Response.status(200).entity(result).build();
}
My client to comsume the Rest service is -
public static void processPOSTRequest() /*throws ResponseStatusNotOKException*/{
User newUser = new User();
newUser.setName("My");
newUser.setId(22L);
newUser.setAddress("nagar");
ClientRequest clientRequest = new ClientRequest("http://localhost:8080/JsonRestExample/userService/update");
clientRequest.accept(MediaType.TEXT_HTML_TYPE);
ClientResponse<User> clientResponse = null;
try {
clientResponse = clientRequest.post(User.class);
if(clientResponse != null && clientResponse.getResponseStatus().getStatusCode() == 200) {
//User responseResult = clientResponse.getEntity();
String json = new ObjectMapper().writeValueAsString(clientResponse.getEntity());
System.out.println(json);
//System.out.println("updated address-> "+responseResult.getAddress()+"id=> "+responseResult.getId()+"Name=> "+responseResult.getName());
}else{
throw new ResponseStatusNotOKException("Response status is not OK.");
}
} catch (Exception e) {
e.printStackTrace();
}
}
I'm searching for the root cause but still clue less .Any Idea how can I resolve this?

you can try post data by xml format, like this:
#POST
#Path("/update")
#Produces("application/xml")
public Response updateRecord(String requestXml) {
User result = null;
//User result = new User();
try {
result = fromXml(requestXml, User.class);
} catch (IOException e) {
e.printStackTrace();
}
result.setName("Ram");
return Response.status(200).entity(result).build();
}
while send http request,u need to convert User class to xml String,and then POST it.

The problem is that you don't define your request's body content.
In your client you should do :
clientRequest.body("application/json", input);
Where input is your newUser encoded in JSON. After this only you should call
clientResponse = clientRequest.post(User.class);

Related

Get response body data for a Network request in DevTools in java

Please help to get the response body(as json) for an intercepted request using Devtools Network. Below is the code I could attempt. Thanks!
devTools.addListener(Network.requestWillBeSent(),
entry -> {
Request req;
RequestId rid=entry.getRequestId();
if (entry.getRequest().getUrl().contains("tender")) {
req=entry.getRequest();
}
try {
br.write("Request URI : " + entry.getRequest().getUrl()+"\n With method : "+entry.getRequest().getMethod() + "\n");
} catch (IOException e) {e.printStackTrace();}
Command <ResponseBody> resBody=Network.getResponseBody(rid);
});
Obviously you're just creating the Command-Object, but not executing and retrieving result.
Try this:
Command<GetResponseBodyResponse> getBody = Network.getResponseBody(responseReceived.getRequestId());
GetResponseBodyResponse response = driver.getDevTools().send(getBody);
ObjectMapper objectMapper = new ObjectMapper();
try {
JsonNode n = objectMapper.readValue(response.getBody(), JsonNode.class);
debug("Response from Command: " + n.toPrettyString());
} catch (JsonMappingException e) {
e.printStackTrace();
} catch (JsonProcessingException e) {
e.printStackTrace();
}
To get this Response Data I registered ResponseReceived-Event using Network.responseReceived() with your DevTools-Instance.

How to verify response of any Http Request is valid JSON or not?

Suppose i have a Http request in json/xml when i post this request then we get some JSON response, then First i need to verify this response is valid json or not in java.how to do that in one go?
You can try to Deserialize, if it passes the Deserialize so it's a valid Json, if your Json is not valid it will return a Exception for you, try something like this:
//I'm using proxy with this request
RESTResponse response = await WebServiceProxy.GetInstance().Request(connection);
//Check if the response is a OK
if (response.statusCode == System.Net.HttpStatusCode.OK)
{
try
{
var obj = JsonConvert.DeserializeObject(response.content);
} catch(Exception ex) { }
}
A wild idea, try parsing it and catch the exception:
public boolean isJSONValid(String test) {
try {
new JSONObject(test);
} catch (JSONException ex) {
// e.g. in case JSONArray is valid as well...
try {
new JSONArray(test);
} catch (JSONException ex1) {
return false;
}
}
return true;
}

empty POST body to JSON using ObjectMapper

i'm trying to read the POST payload using object mapper
ServletInputStream in = null;
try {
in = request.getInputStream();
originalInputStreamMap = mapper.readValue(in,
new TypeReference<Map<String, String>>() {
});
somemap.putAll(somattr);
} catch (RuntimeException ex) {
ex.printStackTrace();
} finally {
if (in != null) {
in.close();
}
}
but if the POST request body is empty
mapper.readValue
will throw an error. my use case is that if there is no request body, i need to set the hashmap to the request body(somemap).

Retrieve response body from ClientResource

I try to issue a POST request with ClientResource, I'm able to retrieve the response STATUS, I also want to get the response body when I get an exception.
Here is my code:
public static Pair<Status, JSONObject> post(String url, JSONObject body) {
ClientResource clientResource = new ClientResource(url);
try {
Representation response = clientResource.post(new JsonRepresentation(body), MediaType.APPLICATION_JSON);
String responseBody = response.getText();
Status responseStatus = clientResource.getStatus();
return new ImmutablePair<>(responseStatus, new JSONObject(responseBody));
} catch (ResourceException e) {
logger.error("failed to issue a POST request. responseStatus=" + clientResource.getStatus().toString(), e);
//TODO - how do I get here the body of the response???
} catch (IOException |JSONException e) {
throw e;
} finally {
clientResource.release();
}
}
Here is the code that my server resource returns in case of failure
getResponse().setStatus(Status.CLIENT_ERROR_FORBIDDEN);
JsonRepresentation response = new JsonRepresentation( (new JSONObject()).
put("result", "failed to execute") );
return response;
I try to catch the "result" with no success
In fact, the getResponseEntity method returns the content of the response. It corresponds to a representation. You can wrap it by a JsonRepresentation class if you expect some JSON content:
try {
(...)
} catch(ResourceException ex) {
Representation responseRepresentation
= clientResource.getResponseEntity();
JsonRepresentation jsonRepr
= new JsonRepresentation(responseRepresentation);
JSONObject errors = jsonRepr.getJsonObject();
}
You can notice that Restlet also supports annotated exceptions.
Otherwise I wrote a blog post about this subject: http://restlet.com/blog/2015/12/21/exception-handling-with-restlet-framework/. I think that it could help you.
Thierry

Why response from Jsoup.connect.execute is null? when throwing IOException?

My code look like this:
When I try to invoke this method with incorrect url e.g. http://en.dddddddddssss.org/ execute throw exception and response is null. Why? How can I got http code in that situation?
public Document getDocumentFromUrl(String url) throws SiteBusinessException {
Response response = null;
try {
response = Jsoup.connect(url).timeout(Constans.TIMEOUT).ignoreHttpErrors(false).userAgent(Constans.USER_AGENT)
.ignoreContentType(Constans.IGNORE_CONTENT_TYPE).execute();
return response.parse();
} catch (IOException ioe) {
LOGGER.warn("Cannot fetch site ]");
return null;
}
}
EDIT
public Document getDocumentFromUrl(String url) throws SiteBusinessException {
Response response = null;
try {
response = Jsoup.connect(url).timeout(Constans.TIMEOUT).ignoreHttpErrors(false)
.userAgent(Constans.USER_AGENT).ignoreContentType(Constans.IGNORE_CONTENT_TYPE).execute();
return response.parse();
} catch (HttpStatusException hse) {
LOGGER.warn("Cannot fetch site [url={}, statusMessage={}, statusCode={}]",
new Object[] { url, response != null ? response.statusMessage() : "<null>",
response != null ? String.valueOf(response.statusCode()) : "<null>" });
throw new SiteBusinessException(response != null ? response.statusMessage() : "<null>",
String.valueOf(response != null ? response.statusCode() : "<null>"));
} catch (IOException ioe) {
LOGGER.warn("IOException. Cannot fetch site [url={}, errorMessage={}]", url, ioe.getMessage());
throw new SiteBusinessException("Not found");
}
}
And then I'm trying to call http://localhost:8090/wrongaddress/. Jboss return HTTP 404.
But my code return
Cannot fetch site [url=http://localhost:8090/wrongaddress/, statusMessage=<null>, statusCode=<null>]
EDIT
WORKING SOLUTION
try {
response = Jsoup.connect(url).execute();
return processDocument(response.parse(), url);
} catch (IllegalArgumentException iae) {
LOGGER.warn("Malformed URL [url={}, message={}]", new Object[] { url, iae.getMessage() });
throw new SiteBusinessException(iae.getMessage());
} catch (MalformedURLException mue) {
LOGGER.warn("Malformed URL [url={}, message={}]", new Object[] { url, mue.getMessage() });
throw new SiteBusinessException(mue.getMessage());
} catch (HttpStatusException hse) {
LOGGER.warn("Cannot fetch site [url={}, statusMessage={}, statusCode={}]",
new Object[] { url, hse.getMessage(), hse.getStatusCode() });
throw new SiteBusinessException(hse.getMessage(), hse.getStatusCode());
} catch (IOException ioe) {
LOGGER.warn("IOException. Cannot fetch site [url={}, errorMessage={}]", url, ioe.getMessage());
throw new SiteBusinessException("Cannot fetch site");
}
No, it doesn't. You are catching the Exception and returning null by yourself. You can never throw an exception and return something at the same time.
There will be no HTTP code, since the host does not exist. HTTP codes are returned by the server. For example, the best known code is 404 (Not Found). When your browser shows 404, it is simply a HTTP/TCP packet send by the server to the client, that contains this code.

Categories

Resources