I'm writting an app which has to post some data on a webservice. To do so, I used that tutorial.
The method "get" is working but not the post.
Webservice code :
[OperationContract]
[WebInvoke(Method = "POST",
ResponseFormat = WebMessageFormat.Json,
RequestFormat = WebMessageFormat.Json,
UriTemplate = "picture")]
public void UploadPicture(RReport report)
{
if(report == null)
throw new WebFaultException<string>("Bad parameter", HttpStatusCode.BadRequest);
//other stuff
}
what is expected by the webservice should look like :
The following is an example request Json body:
{ "PictureBase64":"String content" }
And now the android part :
//Localhost URI
String url = "http://10.0.2.2:51136/API/picture";
RestClient client = new RestClient(url);
try {
Report r = new Report("ok");
//Convert in json
String report = new Gson().toJson(r);
//What shows the log => {"PictureBase64":"ok"}
Log.i("Json", report);
//Add the param
client.AddParam("report", report);
//set the header
client.AddHeader("Content-Type","application/json");
client.Execute(RequestMethod.POST);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String response = client.getResponse();
Log.i("Response", response);
And now the error from the android part :
?<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Request Error</title>
<style>BODY { color: #000000; background-color: white; font-family: Verdana; margin-left: 0px; margin-top: 0px; } #content { margin-left: 30px; font-size: .70em; padding-bottom: 2em; } A:link { color: #336699; font-weight: bold; text-decoration: underline; } A:visited { color: #6699cc; font-weight: bold; text-decoration: underline; } A:active { color: #336699; font-weight: bold; text-decoration: underline; } .heading1 { background-color: #003366; border-bottom: #336699 6px solid; color: #ffffff; font-family: Tahoma; font-size: 26px; font-weight: normal;margin: 0em 0em 10px -20px; padding-bottom: 8px; padding-left: 30px;padding-top: 16px;} pre { font-size:small; background-color: #e5e5cc; padding: 5px; font-family: Courier New; margin-top: 0px; border: 1px #f0f0e0 solid; white-space: pre-wrap; white-space: -pre-wrap; word-wrap: break-word; } table { border-collapse: collapse; border-spacing: 0px; font-family: Verdana;} table th { border-right: 2px white solid; border-bottom: 2px white solid; font-weight: bold; background-color: #cecf9c;} table td { border-right: 2px white solid; border-bottom: 2px white solid; background-color: #e5e5cc;}</style>
</head>
<body>
<div id="content">
<p class="heading1">Request Error</p>
<p xmlns="">The server encountered an error processing the request. Please see the <a rel="help-page" href="http://10.0.2.2:51136/API/help">service help page</a> for constructing valid requests to the service.</p>
</div>
</body>
</html>
EDIT : New way to call my webservice :
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost postRequest = new HttpPost(myWebservice);
StringEntity input = new StringEntity(myJson);
input.setContentType("application/json");
postRequest.setEntity(input);
HttpResponse response = httpClient.execute(postRequest);
you are setting the content type to JSON, but you aren't posting JSON, you are posting key values pairs, where the value is a string (which happens to be JSON, but that irrelevant). does your web service want a JSON body, or form data?
assuming you want to post parameters, not a JSON body, set your mime type to: application/x-www-form-urlencoded
, and also make sure that you are URL encoding the parameters (maybe restlet does that for you, i'm not sure).
on the other hand, if you actually just want to post a JSON body, leave the mime type as-is, and do something like,
StringRepresentation sr = new StringRepresentation(myJsonString);
Representation rep = client.post();
also, assuming this doesn't solve your problem, it'd be good to know the status code from the server. 404? 400? 403? assuming the web service you are using returns the right codes, it could be very helpful in finding the root cause.