解析REST API错误400"错误请求"

时间:2014-06-29 21:04:08

标签: ios rest push-notification xamarin parse-platform

我正在使用Xamarin iOS和iOS开发适用于iOS的应用程序MonoGame。我想通过他们的REST API使用Parse的推送通知,所以首先我必须创建一个安装对象:

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"));

bundleString值为:

  

&#34; {\&#34;通道\&#34;:\&#34; \&#34; \&#34;设备类型\&#34;:\&#34; IOS \ &#34; \&#34; deviceToken \&#34;:\&#34; 46becd0a165be042eeab5a1ec96b8858065cbea7311479da16c0fd1c9428e2eb \&#34;}&#34;

此代码引发System.Net.WebExceptionStatus.ProtocolError错误400&#34;错误请求&#34;,我无法理解原因。

3 个答案:

答案 0 :(得分:1)

根据文档https://www.parse.com/docs/rest#installations

,通道应该是一个字符串数组
bundle.Add("channels", new [] { "" });

答案 1 :(得分:1)

经过更多的追踪和错误后,我发现更换了这个

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();

用这个

httpWebRequest.ContentLength = bundleString.Length;

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

requestWriter.Write(bundleString);

requestWriter.Flush();

requestWriter.Close();

解决了这个问题,但我并不确切知道原因。

答案 2 :(得分:0)

如果您在关闭流之前没有调用flush吗?

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