I am trying to post a new resource to a django tastypie API with a Java Client, but i am getting a Http 500 error code.
Basically i am just trying to make a new reservation on my api from the client.
Models:
class Author(models.Model):
name = models.CharField(max_length=50)
email = models.EmailField()
def __unicode__(self):
return self.name
class Product(models.Model):
author = models.ForeignKey(Author)
name = models.CharField(max_length=100)
genre = models.CharField(max_length=100)
pub_date = models.DateTimeField()
class Reservation(models.Model):
user = models.ForeignKey(User)
product = models.ForeignKey(Product)
reserv_date_start = models.DateTimeField()
reserv_finish = models.DateTimeField()
penalty = models.BooleanField()
def __unicode__(self):
return self.product.name
Resources:
class AuthorResource(ModelResource):
#user = fields.ForeignKey(UserResource, 'user')
class Meta:
queryset = Author.objects.all()
resource_name = 'author'
authentication = BasicAuthentication()
authorization = DjangoAuthorization()
class ProductResource(ModelResource):
author = fields.ForeignKey(AuthorResource, 'author')
class Meta:
queryset = Product.objects.all()
resource_name = 'product'
authentication = BasicAuthentication()
authorization = DjangoAuthorization()
class ReservationResource(ModelResource):
product = fields.ForeignKey(ProductResource, 'product')
class Meta:
queryset = Reservation.objects.all()
resource_name = 'reservation'
authentication = BasicAuthentication()
authorization = DjangoAuthorization()
My json that i am posting (i am using java simple json and i am getting the backslashes and i don’t know how to take it out):
public JSONObject encodeJsonObject(Reservation reservation){
JSONObject obj=new JSONObject();
obj.put("id",String.valueOf(reservation.getId()));
obj.put("product","/api/reservation/product/"+reservation.getProduct().getId()+"/");
obj.put("reserv_date_start",new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'+00:00'").format(reservation.getReserv_date_start()));
obj.put("reserv_finish",new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'+00:00'").format(reservation.getReserv_finish()));
obj.put("resource_uri", "/api/reservation/reservation/"+reservation.getId()+"/");
obj.put("penalty",reservation.isPenalty());
return obj;
}
json: {
"product": "\/api\/reservation\/product\/12\/",
"id": "7",
"reserv_finish": "2013-01-05T23:11:51+00:00",
"resource_uri": "\/api\/reservation\/reservation\/7\/",
"penalty": false,
"reserv_date_start": "2013-01-05T23:11:51+00:00"
}
My client to post code:
public void apacheHttpClientPost(String url, String user, char[] pass, JSONObject data) {
try {
DefaultHttpClient httpClient = new DefaultHttpClient();
httpClient.getCredentialsProvider().setCredentials(new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT, AuthScope.ANY_REALM),
new UsernamePasswordCredentials(user, new String(pass)));
HttpPost postRequest = new HttpPost(url);
StringEntity input = new StringEntity(data.toJSONString());
input.setContentType("application/json");
postRequest.setEntity(input);
HttpResponse response = httpClient.execute(postRequest);
if (response.getStatusLine().getStatusCode() != 201) {
throw new RuntimeException("Failed : HTTP error code : "
+ response.getStatusLine().getStatusCode());
}
BufferedReader br = new BufferedReader(
new InputStreamReader((response.getEntity().getContent())));
String output;
System.out.println("Output from Server .... \n");
while ((output = br.readLine()) != null) {
System.out.println(output);
}
httpClient.getConnectionManager().shutdown();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
one of the debug errors:
/usr/local/lib/python2.7/dist-packages/django/db/models/fields/init.py:808:
RuntimeWarning: DateTimeField received a naive datetime (2013-01-04
17:31:57) while time zone support is active. RuntimeWarning)
i am posting to
got it. the problem was in my json that was incomplete. i had a foreign key to my user resource that i didn’t add. here is the solution:
json:
resource:
java client code: