Parsing push REST API error 400 Permintaan Buruk

Saya sedang mengembangkan aplikasi untuk iOS menggunakan Xamarin iOS & MonoGame. Saya ingin menggunakan pemberitahuan push Parse melalui REST API mereka, jadi pertama-tama saya harus membuat objek instalasi:

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

Nilai bundleString adalah:

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

Kode ini memunculkan kesalahan System.Net.WebExceptionStatus.ProtocolError 400 "Permintaan Buruk", dan saya tidak mengerti alasannya.


person user123    schedule 29.06.2014    source sumber
comment
Mengapa Anda tidak menggunakan Parse SDK untuk melakukan ini? parse.com/products/xamarin   -  person Jason    schedule 30.06.2014
comment
@Jason saya! tetapi Parse SDK untuk Xamarin iOS tidak mengimplementasikan fungsi Parse push, oleh karena itu saya terpaksa melakukannya melalui REST API. Meskipun saya dapat melanjutkan dan membuat pengikatan dari iOS SDK, ini mempersulit banyak kode lainnya.   -  person user123    schedule 30.06.2014


Jawaban (3)


Saluran seharusnya berupa array string sesuai dengan dokumentasi, https://www.parse.com/docs/rest#installations

bundle.Add("channels", new [] { "" });
person tvanfosson    schedule 29.06.2014
comment
sayangnya saya masih mendapatkan pengecualian yang sama. - person user123; 30.06.2014
comment
Apakah ada informasi tambahan dalam respons selain kesalahan? Biasanya 400 Bad Request akan digunakan untuk menunjukkan kegagalan validasi dalam data permintaan. - person tvanfosson; 30.06.2014
comment
Saya tidak dapat menemukan cara untuk menyalin semua pengecualian ke clipboard, tapi ini pada dasarnya --› e = {System.Net.WebException: Server jarak jauh mengembalikan kesalahan: (400) Permintaan Buruk. di System.Net.HttpWebRequest.CheckFinalStatus (hasil System.Net.WebAsyncResult) [0x0033b] di /Developer/MonoTouch/Source/mono/mcs/class/System/System.Net/HttpWebRequest.cs:... - person user123; 30.06.2014
comment
Saya sebenarnya sedang memikirkan isi tanggapannya, bukan pengecualiannya. Sudahkah Anda mencoba mereplikasi permintaan dengan Fiddler atau yang serupa? - person tvanfosson; 30.06.2014
comment
isinya adalah 'kode:107,kesalahan:json tidak valid'. Saya belum pernah menggunakan alat apa pun seperti fiddler sejauh ini. Saya pikir ada sesuatu yang salah dengan string bundel saya, meskipun saya masih tidak dapat melihatnya. - person user123; 30.06.2014
comment
Mungkin coba enkode dengan Newtonsoft.Json, nuget.org/packages/newtonsoft.json ? - person tvanfosson; 30.06.2014
comment
Baru saja mencoba tetapi tidak ada yang berubah. Saya memeriksa string bundel sebagai JSON di kedua kerangka kerja dan keduanya identik. - person user123; 30.06.2014
comment
Mungkinkah token perangkat Anda tidak valid? - person tvanfosson; 30.06.2014
comment
ketika saya menerima token dalam metode 'RegisteredForRemoteNotifications', saya memprosesnya dengan menghilangkan tanda kurung dan spasi 'deviceToken.ToString().Trim('‹', '›').Replace( , )' lalu saya menggunakannya. Saya tidak yakin parse memerlukan ini tetapi saya tetap melakukannya. Saya mencoba mempertahankan tanda kurung dan spasi, dan saya masih mendapatkan kesalahan yang sama. - person user123; 30.06.2014

Setelah lebih banyak jejak dan kesalahan, saya menemukan itu menggantikan ini

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

dengan ini

httpWebRequest.ContentLength = bundleString.Length;

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

requestWriter.Write(bundleString);

requestWriter.Flush();

requestWriter.Close();

memperbaiki masalahnya, saya tidak tahu persis alasannya.

person user123    schedule 03.07.2014

bukankah sebaiknya Anda menelepon flush sebelum menutup streaming Anda?

requestWriter.Write(result, 0, result.Length);
requestWriter.Close();
person Dean Chalk    schedule 30.06.2014
comment
Menambahkannya tetapi masih mendapatkan pengecualian. Saya mencoba mengakses konten respons dari bidang respons pengecualian di panel lokal, tetapi sejauh ini tidak berhasil. - person user123; 30.06.2014
comment
Saya dapat mengekstrak konten respons 'kode:107,kesalahan:json tidak valid' - person user123; 30.06.2014
comment
Mengapa tidak menggunakan DataContractJsonSerializer saja - msdn.microsoft.com/en-us/library/ - person Dean Chalk; 30.06.2014
comment
Karena ServiceStack tampaknya melakukan pekerjaannya dengan baik dan saya juga menggunakannya di tempat lain dalam proyek ini. - person user123; 30.06.2014