Search code examples
javaapitrello

trello api "PUT /1/cards/[card id]/desc" returns a 400 response with message "invalid value for value"


I've spend a week trying to work out how to update some card information, I'd hoped to update a load of fields at one, e.g. name, desc, idList, closed etc, but after looking around it seems they have to be done individually, but when I try I keep getting a 400 response with message "invalid value for value" .

e.g. When I try to PUT https://api.trello.com/1/cards/[cardid]/desc?key=[mykey]&token=[mytoken]value=just+yet+another+test+of+trello+side+extended

what am I doing wrong?

Java code used to send Put is

private static InputStream doRequest(final String url, final String requestMethod, final Map<String, String> map) 
{
    try 
    {
        final HttpsURLConnection conn = (HttpsURLConnection) new URL(url)
                .openConnection();
        conn.setRequestProperty("Accept-Encoding", "gzip, deflate");
        conn.setDoOutput(requestMethod.equals(METHOD_POST) || requestMethod.equals(METHOD_PUT));
        conn.setRequestMethod(requestMethod);

        String plus = "";
        if (map != null && !map.isEmpty()) 
        {
            final StringBuilder sb = new StringBuilder();
            for (String key : map.keySet()) 
            {
                sb.append(sb.length() > 0 ? "&" : "")
                    .append(key)
                    .append("=")
                    .append(URLEncoder.encode(map.get(key), "UTF-8"));
            }
            conn.getOutputStream().write(sb.toString().getBytes());
            conn.getOutputStream().close();
            plus = sb.toString();
        }
        final int rc = conn.getResponseCode();
        logger.info("response " + rc + " from " + requestMethod + " " + url + plus);
        if (rc > 399) 
        {
             return null;
        } 
        else 
        {
            return getWrappedInputStream(
                conn.getInputStream(), GZIP_ENCODING.equalsIgnoreCase(conn.getContentEncoding())
            );
        }
    } 
    catch (IOException e) 
    {
        throw new TrelloException(e.getMessage());
    }
}

Solution

  • I found that I was missing one line in the code

                conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
    

    that solved the problem, so here is the complete code for doRequest now...

        private static InputStream doRequest(final String url, final String requestMethod, final Map<String, String> map) 
    {
        try 
        {
            final HttpsURLConnection conn = (HttpsURLConnection) new URL(url).openConnection();
            conn.setRequestProperty("Accept-Encoding", "gzip, deflate");
            conn.setDoOutput(requestMethod.equals(METHOD_POST) || requestMethod.equals(METHOD_PUT));
            conn.setRequestMethod(requestMethod);
            // following line was missing and caused PUT not to work.
            conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
    
            String arguments = "";
            if (map != null && !map.isEmpty()) 
            {
                final StringBuilder sb = new StringBuilder();
                for (String key : map.keySet()) 
                {
                    sb.append(sb.length() > 0 ? "&" : "");
                    sb.append(URLEncoder.encode(key, HTTP_CHARACTER_ENCODING));
                    sb.append("=");
                    sb.append(URLEncoder.encode(map.get(key), HTTP_CHARACTER_ENCODING));
                }
                conn.getOutputStream().write(sb.toString().getBytes());
                conn.getOutputStream().close();
                arguments = sb.toString();
            }
            conn.connect();
    
            final int rc = conn.getResponseCode();
            final String responseMessage = conn.getResponseMessage();
            if (rc != 200)
                logger.info("response " + rc + " (" + responseMessage + ") from " + requestMethod + " " + url + " args:" + arguments);
            if (rc > 399) 
            {
                final String str = stream2String(conn.getErrorStream());
                logger.info("error response:" + str);
                return null;
            } 
            else 
            {
                return getWrappedInputStream(
                    conn.getInputStream(), GZIP_ENCODING.equalsIgnoreCase(conn.getContentEncoding())
                );
            }
        } 
        catch (IOException e) 
        {
            throw new TrelloException(e.getMessage());
        }
    }