5
votes

I'm trying to use JSON over HTTP to communicate with the Twilio API (I'm running on asp.net vNext - and their C# library doesn't yet support coreclr)

I've got the following code, but every time I call the API I get the same 400 - Bad request response:

{"code": 21603, "message": "A 'From' phone number is required.", "more_info": "https://www.twilio.com/docs/errors/21603", "status": 400}

I'm using the following code to setup the request and make the call - the auth succeeds and I get the above error:

var byteArray = Encoding.ASCII.GetBytes("{AccountSid}:{AuthToken}");

HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray));

var jsonStr = JsonConvert.SerializeObject(new {
    From = WebUtility.UrlEncode("+15005550003"), // A test number twilio supply
    To = WebUtility.UrlEncode("{my phone number}"),
    Body = WebUtility.UrlEncode("Hi there from a pure json rest client...")
});

var response = await client.PostAsync("https://api.twilio.com/2010-04-01/Accounts/{AccountSid}/SMS/Messages.json", new StringContent(jsonStr));
3

3 Answers

8
votes

After contacting support and dealing with a very helpful guy called Joshua, we have figured it out.

In Twilio docs you can either use a url with "messages.json" or "messages.xml" - I took that to mean: whichever url you use, the message (request and response) will have to follow that format.

Unfortunately that is not true - all requests to Twilio, must be of Content-Type: application/x-www-form-urlencoded

e.g. To=0123456789&From=9876543210&Body=Hi

in C# (HttpClient) that looks like:

_client.PostAsync(_url, new FormUrlEncodedContent(new Dictionary<string, string>(){
 { "To", "0123456789" }, 
 { "From", "9876543210" }, 
 { "Body", "Hi" } }));
0
votes

I'm Megan from the Developer Community team at Twilio.

It looks like the number you are using, "+15005550003" is one of Twilio's magic input numbers that actually represents the "To" field, thus the error you are receiving. Depending on what you want to test, you might try passing in "+15005550006" instead.

You can see more about what each magic input represents in the docs here.

Hope this helps!

0
votes

If using an SMS / Messaging Service which allows you to send from multiple phone numbers and you get this error,

then replace

{ "From","<number>" }

with

{ "MessagingServiceSid","<sid>" }

the SID can be found on the messaging services page https://www.twilio.com/console/sms/services