We all started somewhere! Share your experience on the Get Advice: Let's Get Started Sweepstakes thread and be entered to win a $100 credit on your Constant Contact account.

415 Unsupported Media Type when (Java HttpPut)

SOLVED
Go to solution
KristiF2
Regular Participant

415 Unsupported Media Type when (Java HttpPut)

I'm having trouble doing an HttpPut in Java. Getting a "415 Unsupported Media Type" error.

 

Here's my put method:

 

    public HttpEntity put(String path, String xml) throws Exception
    {
    	// Use HTTPS
        HttpHost targetHost = new HttpHost("api.constantcontact.com", 443, "https");

        DefaultHttpClient httpclient = new DefaultHttpClient();
        httpclient.getCredentialsProvider().setCredentials(new AuthScope(targetHost.getHostName(),
    		targetHost.getPort()), new UsernamePasswordCredentials(apikey+"%"+username, password));

        // Use BASIC authentication
        AuthCache authCache = new BasicAuthCache();
        BasicScheme basicAuth = new BasicScheme();
        authCache.put(targetHost, basicAuth);
        BasicHttpContext localcontext = new BasicHttpContext();
        localcontext.setAttribute(ClientContext.AUTH_CACHE, authCache);
        
        // Put the request
        HttpPut httpput = new HttpPut("/ws/customers/"+username+path);
        httpput.addHeader("Content-Type", "application/atom+xml");
        StringEntity entity = new StringEntity(xml, "UTF-8");
        entity.setContentType("application/xml");
        httpput.setEntity(entity);
        HttpResponse response = httpclient.execute(targetHost, httpput, localcontext);
        StatusLine status = response.getStatusLine();
        if (status.getStatusCode() != HttpStatus.SC_OK)
    	{
        	throw new Exception(status.getStatusCode()+" "+status.getReasonPhrase());
    	}
        return response.getEntity();
    }

 Here's the XML entity:

 

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<entry xmlns="http://www.w3.org/2005/Atom">
    <title type="text"> </title>
    <updated>2008-07-23T14:21:06.407Z</updated>
    <author/><id>data:,none</id>
    <summary type="text">Contact</summary>
    <content type="application/vnd.ctct+xml">
        <Contact xmlns="http://ws.constantcontact.com/ns/1.0/">
            <EmailAddress>nobody@nowhere.com</EmailAddress>
            <OptInSource>ACTION_BY_CUSTOMER</OptInSource>
            <ContactLists>
                <ContactList id="http://api.constantcontact.com/ws/customers/.../lists/0"/>
            </ContactLists>
        </Contact>
    </content>
</entry>

 

 

Thanks.

Tom

 

1 ACCEPTED SOLUTION

415 Error indicates that you are making a request that is not allowed on that resource (PUT request not allowed, for example) or that your content type is incorrect.  From your code, it appears that the content type is correct.  My guess would be that the URI you're creating for your request is incorrect.

 

PUT requests are only allows on the actual Contact resource you are trying to update.  For those requests, the format of the URI is:

 

https://api.constantcontact.com/ws/customers/{Username}/contacts/{Contact_ID}

 

Without seeing the actual URI you're posting to, it's hard to tell if this is the actual cause.  415 error does not indicate that anything is wrong with your XML though, 415 errors are thrown before the XML is even parsed (it's a request type validation error, thus we don't even look at the contents of your request).  Can you let us know the actual URI you're makin the PUT to?

Dave Berard
Senior Product Manager, Constant Contact

View solution in original post

11 REPLIES 11
KristiF2
Regular Participant

Looking over this post, I see that the XML looks malformed (no <author> tag). I must have accidentally deleted in in the cut/paste/format effort. This XML is created and rendered using DOM, so the starting <author> tag is surely there.

Hello,

 

I see that you may have resolved this on your own, but I wanted to check in with you to see if you needed any additional help.  If you are still having trouble just let us know!

 

Regards,

Benjamin Soder
NOC Analyst
Constant Contact
KristiF2
Regular Participant

I have not resolved this. I double-checked the XML and it is correct. I removed the XML normalization that resulted in the orphan <author/> tag so that I had "<author> <author/>". Unfortunately, I'm still getting the 415 error. Any help you can offer would be greatly appreciated.

415 Error indicates that you are making a request that is not allowed on that resource (PUT request not allowed, for example) or that your content type is incorrect.  From your code, it appears that the content type is correct.  My guess would be that the URI you're creating for your request is incorrect.

 

PUT requests are only allows on the actual Contact resource you are trying to update.  For those requests, the format of the URI is:

 

https://api.constantcontact.com/ws/customers/{Username}/contacts/{Contact_ID}

 

Without seeing the actual URI you're posting to, it's hard to tell if this is the actual cause.  415 error does not indicate that anything is wrong with your XML though, 415 errors are thrown before the XML is even parsed (it's a request type validation error, thus we don't even look at the contents of your request).  Can you let us know the actual URI you're makin the PUT to?

Dave Berard
Senior Product Manager, Constant Contact

View solution in original post

KristiF2
Regular Participant

Because this is a new contact (no contact ID yet), I am PUT'ing it to the contacts collection ".../contacts". This is what I interpreted the API to say. After seeing your message, I reread the "Creating a contact" API documentation and it says that I should be POST'ing (not PUT'ing) to the contacts collection. I'll give that a shot, and any other suggestions are welcome.

You got it exactly Kristi!  There are some RESTful webservices that interpret PUT as "Update or create if resource doesn't exist".  Our API is more literal in that a POST request is a create (and must be done on the Collection) and a PUT request is an update (and must be done on the individual resource you are updating).  This is because we do create a unique internal ID value for every Contact and thus a PUT request to update or create doesn't make sense in our API.  You should be all set if you change the request type to POST for the creation.

 

Hope this explains it and gets you going!

Dave Berard
Senior Product Manager, Constant Contact
KristiF2
Regular Participant

I'm getting closer. It's now a 400 error (bad request).

 

My post method looks exactly like the PUT method (above). Here's the XML document that I'm POST'ing:

 

<?xml version="1.0" encoding="UTF-8" standalone="no"?>

<entry xmlns="http://www.w3.org/2005/Atom">

<title type="text"> </title>

<updated>2011-04-18T10:54:10.404-0500</updated>

<author> </author>

<id>data:,none</id>

<summary type="text">Contact</summary>

<content type="application/vnd.ctct+xml">

<Contact xmlns="http://ws.constantcontact.com/ns/1.0/">

<EmailAddress>nobody@nowhere.com</EmailAddress>

<OptInSource>ACTION_BY_CUSTOMER</OptInSource>

<ContactLists>

<ContactList id="http://api.constantcontact.com/ws/customers/westbanklibrary/lists/0"/>

</ContactLists>

</Contact>

</content>

</entry>

Looks like the problem is your list ID being invalid.  List ID values start at 1 and increment as you create more lists.  0 would always be an invalid List ID number so it should be correctly returning a 400 Bad Request response.

 

For more information on retreiving list IDs, please see this overview: http://community.constantcontact.com/t5/Documentation/Retrieving-a-Contact-List-Collection/ba-p/2506...

Dave Berard
Senior Product Manager, Constant Contact
KristiF2
Regular Participant

The problem now is that when I retrieve a contact, it doesn't contain the contact lists. Whether I look it up by "contact-id" or by email address, the result is the same. The following user is (according to the Constant Contact GUI) subscribed to our General Newsletter (/list/2). However, this is the XML that I get back:

 

 

<?xml version="1.0" encoding="UTF-8" standalone="no"?><feed xmlns="http://www.w3.org/2005/Atom">
  <id>http://api.constantcontact.com:443/ws/customers/westbanklibrary/contacts</id>
  <title type="text">Contacts for Customer: westbanklibrary</title>
  <link href="contacts"/>
  <link href="contacts" rel="self"/>
  <author>
    <name>westbanklibrary</name>
  </author>
  <updated>2011-04-18T21:15:39.787Z</updated>
  <link href="/ws/customers/westbanklibrary/contacts" rel="first"/>
  <link href="/ws/customers/westbanklibrary/contacts?email=janet%40property-tax.com" rel="current"/>
  <entry>
    <link href="/ws/customers/westbanklibrary/contacts/3" rel="edit"/>
    <id>http://api.constantcontact.com:443/ws/customers/westbanklibrary/contacts/3</id>
    <title type="text">Contact: janet@property-tax.com</title>
    <updated>2011-04-18T21:15:39.811Z</updated>
    <author>
      <name>Constant Contact</name>
    </author>
    <content type="application/vnd.ctct+xml">
      <Contact xmlns="http://ws.constantcontact.com/ns/1.0/" id="http://api.constantcontact.com:443/ws/customers/westbanklibrary/contacts/3">
        <Status>Active</Status>
        <EmailAddress>janet@property-tax.com</EmailAddress>
        <EmailType>HTML</EmailType>
        <Name/>
        <OptInTime>2011-04-18T18:05:31.102Z</OptInTime>
        <OptInSource>ACTION_BY_CUSTOMER</OptInSource>
        <Confirmed>true</Confirmed>
        <InsertTime>2011-04-18T18:05:31.102Z</InsertTime>
      </Contact>
    </content>
  </entry>
</feed>

 

 

Thanks,

Tom

 

P.S. Kristi is the librarian in charge of the newsletters. I'm the developer.

Hi Tom,

 

When Searching For a Contact By Email Address, we will return an overview of any contact(s) that were found in the search. If you are looking to obtain full details, including the contact lists a contact is subscribed to, you would want to then perform a GET on that specific resource to Obtain a Contact's Information. From the XML you pasted above, you would want to follow use 'link' node:

 

<link href="/ws/customers/westbanklibrary/contacts/3" rel="edit"/>

 

and thus perform the GET on https://api.constantcontact.com/ws/customers/westbanklibrary/contacts/3.

 

This should return the full details for that contact, including their contact lists.

David J

KristiF2
Regular Participant

I think that's exactly what I was missing. Thanks.

 

Tom

Developer Portal

View API documentation, code samples, get your API key.

Visit Page