user123
user123

Reputation: 621

Parse push REST API error 400 "Bad Request"

I am developing an app for iOS using Xamarin iOS & MonoGame. I want to use Parse's push notifications through their REST API, so first I must create an installation object:

var bundle = new Dictionary<string, object>();
bundle.Add("channels", "");
bundle.Add("deviceType", "ios");
bundle.Add("deviceToken", _deviceToken);

string urlpath = "https://api.parse.com/1/installations";
var httpWebRequest = (HttpWebRequest)WebRequest.Create(urlpath);
httpWebRequest.ContentType = "application/json";
httpWebRequest.Headers.Add("X-Parse-Application-Id", _parseAppID);
httpWebRequest.Headers.Add("X-Parse-REST-API-KEY", _parseRestAPIKey);
httpWebRequest.Method = "POST";
string bundleString = bundle.ToJson();
byte[] buffer = Encoding.GetEncoding("UTF-8").GetBytes(bundleString);
string result = Convert.ToBase64String(buffer);
StreamWriter requestWriter = new StreamWriter(httpWebRequest.GetRequestStream());
requestWriter.Write(result, 0, result.Length);
requestWriter.Close();
WebResponse httpResponse = await httpWebRequest.GetResponseAsync();

Stream stream = httpResponse.GetResponseStream();
string json = string.Empty;

using (StreamReader reader = new StreamReader(stream))
{
    while (!reader.EndOfStream)
    {
        json += reader.ReadLine();
    }
}

JsonObject jsonObject = JsonObject.Parse(json);
_varStorage.Save("ObjectId", jsonObject.Get<string>("objectId"));

The bundleString value is:

"{\"channels\":\"\",\"deviceType\":\"ios\",\"deviceToken\":\"46becd0a165be042eeab5a1ec96b8858065cbea7311479da16c0fd1c9428e2eb\"}"

This code raises a System.Net.WebExceptionStatus.ProtocolError error 400 "Bad Request", and I can't see why.

Upvotes: 4

Views: 3417

Answers (3)

user123
user123

Reputation: 621

After more trail and error, I found that replacing this

byte[] buffer = Encoding.GetEncoding("UTF-8").GetBytes(bundleString);

string result = Convert.ToBase64String(buffer);

StreamWriter requestWriter = new StreamWriter(httpWebRequest.GetRequestStream());

requestWriter.Write(result, 0, result.Length);

requestWriter.Flush();

requestWriter.Close();

with this

httpWebRequest.ContentLength = bundleString.Length;

StreamWriter requestWriter = new StreamWriter(httpWebRequest.GetRequestStream());

requestWriter.Write(bundleString);

requestWriter.Flush();

requestWriter.Close();

fixed the problem, I don't know exactly why though.

Upvotes: 1

Dean Chalk
Dean Chalk

Reputation: 20461

should you not be calling flush before closing your stream ?

requestWriter.Write(result, 0, result.Length);
requestWriter.Close();

Upvotes: 0

tvanfosson
tvanfosson

Reputation: 532485

Channels is supposed to be an array of strings according to the documentation, https://www.parse.com/docs/rest#installations

bundle.Add("channels", new [] { "" });

Upvotes: 1

Related Questions