New C# Wrapper : PUT request: BadRequest?

275 views
Skip to first unread message

ThomasGugler

unread,
Dec 15, 2010, 9:27:51 AM12/15/10
to SoundCloudAPI
I am working on a C# Wrapper that works with WPF, Silverlight and for
sure Windows Phone7,
and im going to use the nice REST opensource library hammock (http://
hammock.codeplex.com)

OAuth works...also the GET requests (/me, /me/tracks..) do work :)
but POST requests do not :(
in particular neither creating a new playlist nor uploading a new
track..

method "AddTrack" and "CreatePlaylist":
i always get a server Bad request...the correct Addfile, AddParameter,
AddHeader...thats the problem i think?

thanks for any help in advance!
=> email me if any anyone can help ...i could send a working
testclient for debugging purpose.

Thomas

-------------------------------------------------------------------------------------------------------------------
using System.Text;
using System.Xml.Linq;
using Hammock;
using Hammock.Authentication.OAuth;
using Hammock.Web;

public class SoundCloudAPI
{
internal static RestResponse GetRequestTokenQuery()
{
var client = new RestClient { Authority = "http://
api.soundcloud.com", UserAgent = "Hammock" };
var request = new RestRequest { Path = "oauth/
request_token", Credentials =
OAuthCredentials.ForRequestToken(ClientSettings.consumerKey,
ClientSettings.consumerKeySecret) };
return client.Request(request);
}

internal static RestResponse GetAccessTokenQuery(string
requestToken, string RequestTokenSecret, string oAuthVerificationPin)
{
var client = new RestClient { Authority = "http://
api.soundcloud.com", UserAgent = "Hammock" };
var request = new RestRequest { Path = "oauth/
access_token",
Credentials =
OAuthCredentials.ForAccessToken(ClientSettings.consumerKey,
ClientSettings.consumerKeySecret, requestToken, RequestTokenSecret,
oAuthVerificationPin) };
return client.Request(request);
}

internal static XElement GetMyTracks(string accessToken,
string accessTokenSecret)
{
return GetProtectedResource(accessToken,
accessTokenSecret, "me/tracks");
}

private static XElement GetProtectedResource(string
accessToken, string accessTokenSecret, string path)
{
var client = new RestClient { Authority = "http://
api.soundcloud.com", UserAgent = "Hammock" };
var request = new RestRequest { Path = path,
Credentials =
OAuthCredentials.ForProtectedResource(ClientSettings.consumerKey,
ClientSettings.consumerKeySecret, accessToken, accessTokenSecret) };
var response = client.Request(request);
var statusCode = response.StatusCode.ToString();
XElement tracks = XElement.Parse(response.Content);
return tracks;
}

internal static void AddTrack(string accessToken, string
accessTokenSecret)
{
var client = new RestClient { Authority = "http://
api.soundcloud.com", UserAgent = "Hammock" };
// ?? client.AddHeader("Content-Type", "multipart/form-
data");
var request = new RestRequest
{
Path = "tracks",
Method = WebMethod.Post,
Credentials =
OAuthCredentials.ForProtectedResource(ClientSettings.consumerKey,
ClientSettings.consumerKeySecret, accessToken, accessTokenSecret)
};
request.AddFile("name","fileName", @"C:\Users\Thomas\Music
\Soap and Skin - Spiracle.mp3");
var response = client.Request(request);
}

internal static XElement CreatePlaylist(string accessToken,
string accessTokenSecret)
{
var client = new RestClient { Authority = "http://
api.soundcloud.com", UserAgent = "Hammock" };
//?? client.AddHeader("Content-Type", "application/xml");
//?? client.AddHeader("Content-Type", "application/x-www-
form-urlencoded");
//?? client.AddHeader("Content-Type", "multipart/form-
data");
var request = new RestRequest
{
Path = "playlists",
Method = WebMethod.Post,
Credentials =
OAuthCredentials.ForProtectedResource(ClientSettings.consumerKey,
ClientSettings.consumerKeySecret, accessToken, accessTokenSecret)
};
var ByteData = Encoding.UTF8.GetBytes("<playlist>
<created-at type=\"datetime\">2008-07-22T13:28:59+02:00</created-
at> <title>My Set</title> <description>This is my set</
description> <shared-to> <emails type=\"array\">
<email> <address>a.u...@example.com</address> </
email> </emails> </shared-to> <tracks type=\"array\">
<track> <id>14</id> </track> </tracks> </playlist>");
request.AddPostContent(ByteData);
// ?? request.AddField("title", "the title of the
playlist");
var response = client.Request(request);
var statusCode = response.StatusCode.ToString();
XElement tracks = XElement.Parse(response.Content);
return tracks;
}
}

Hannes Tydén

unread,
Dec 16, 2010, 6:14:51 AM12/16/10
to SoundCloudAPI
Hi Thomas!

For file uploads you must send a "Content-Type: multipart/form-data"
header. Also this request requires a string for the track[title] and a
file for the track[asset_data] parameters.

I am not familiar with the library you're using but I'd imagine that

request.AddFile("name","fileName", @"C:\Users\Thomas\Music
\Soap and Skin - Spiracle.mp3");

adds the file to the request as the parameter "name" which then should
be "track[asset_data]"

When posting xml as the request body you must send a "Content-Type:
application/xml" header.

Is there support for OAuth 2 in Hammock? Please read about our support
for OAuth 2 here: https://github.com/soundcloud/api/wiki/13-X-OAuth-2

Cheers,
Hannes

curlyfro

unread,
Mar 4, 2012, 10:02:34 PM3/4/12
to soundc...@googlegroups.com
did you ever get uploading working?
Reply all
Reply to author
Forward
0 new messages