แยกวิเคราะห์ข้อผิดพลาด REST API 400 คำขอไม่ถูกต้อง

ฉันกำลังพัฒนาแอปสำหรับ iOS โดยใช้ Xamarin iOS และ MonoGame ฉันต้องการใช้การแจ้งเตือนแบบพุชของ Parse ผ่าน REST API ดังนั้นก่อนอื่นฉันต้องสร้างวัตถุการติดตั้ง:

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 คือ:

"{\"ช่อง\":\"\",\"deviceType\":\"ios\",\"deviceToken\":\"46becd0a165be042eeab5a1ec96b8858065cbea7311479da16c0fd1c9428e2eb\"}"

รหัสนี้ทำให้เกิดข้อผิดพลาด System.Net.WebExceptionStatus.ProtocolError 400 "Bad Request" และฉันไม่เข้าใจสาเหตุ


person user123    schedule 29.06.2014    source แหล่งที่มา
comment
เหตุใดคุณไม่ใช้ Parse SDK เพื่อทำสิ่งนี้ parse.com/products/xamarin   -  person Jason    schedule 30.06.2014
comment
@เจสัน ฉันเอง! แต่ Parse SDK สำหรับ Xamarin iOS ไม่มีการใช้งานฟังก์ชัน Parse push ดังนั้นฉันจึงถูกบังคับให้ทำผ่าน REST API แม้ว่าฉันจะสามารถสร้างการเชื่อมโยงจาก iOS SDK ได้ แต่โค้ดอื่นๆ ก็ยังมีความซับซ้อนอยู่มาก   -  person user123    schedule 30.06.2014


คำตอบ (3)


Channels ควรเป็นอาร์เรย์ของสตริงตามเอกสารประกอบ https://www.parse.com/docs/rest#installations

bundle.Add("channels", new [] { "" });
person tvanfosson    schedule 29.06.2014
comment
น่าเสียดายที่ฉันยังคงได้รับข้อยกเว้นเดียวกัน - person user123; 30.06.2014
comment
มีข้อมูลเพิ่มเติมใดๆ ในการตอบสนองนอกเหนือจากข้อผิดพลาดหรือไม่ โดยทั่วไปแล้ว 400 Bad Request จะใช้เพื่อระบุความล้มเหลวในการตรวจสอบความถูกต้องในข้อมูลคำขอ - person tvanfosson; 30.06.2014
comment
ฉันไม่สามารถหาวิธีคัดลอกทุกอย่างยกเว้นลงในคลิปบอร์ดได้ แต่โดยพื้นฐานแล้วก็คือ --› e = {System.Net.WebException: เซิร์ฟเวอร์ระยะไกลส่งคืนข้อผิดพลาด: (400) คำขอไม่ถูกต้อง ที่ System.Net.HttpWebRequest.CheckFinalStatus (ผลลัพธ์ System.Net.WebAsyncResult) [0x0033b] ใน /Developer/MonoTouch/Source/mono/mcs/class/System/System.Net/HttpWebRequest.cs:... - person user123; 30.06.2014
comment
จริงๆ แล้วฉันกำลังคิดในเนื้อหาของคำตอบ ไม่ใช่ข้อยกเว้น คุณได้ลองจำลองคำขอด้วย Fiddler หรืออะไรที่คล้ายกันแล้วหรือยัง? - person tvanfosson; 30.06.2014
comment
เนื้อหาคือ 'รหัส: 107, ข้อผิดพลาด: json ไม่ถูกต้อง' ฉันยังไม่ได้ใช้เครื่องมือใด ๆ เช่นพู้ทำเล่นจนถึงตอนนี้ ฉันคิดว่ามีบางอย่างผิดปกติกับมัดรวมของฉัน แม้ว่าฉันจะยังมองไม่เห็นก็ตาม - person user123; 30.06.2014
comment
อาจลองเข้ารหัสด้วย Newtonsoft.Json nuget.org/packages/newtonsoft.json ? - person tvanfosson; 30.06.2014
comment
เพิ่งลองแต่ไม่มีอะไรเปลี่ยนแปลง ฉันตรวจสอบสตริงบันเดิลเป็น JSON ในทั้งสองเฟรมเวิร์กและเหมือนกัน - person user123; 30.06.2014
comment
เป็นไปได้ไหมว่าโทเค็นอุปกรณ์ของคุณไม่ถูกต้อง - person tvanfosson; 30.06.2014
comment
เมื่อฉันได้รับโทเค็นในวิธี 'RegisteredForRemoteNotifications' ฉันจะประมวลผลโดยการลบวงเล็บและช่องว่าง 'deviceToken.ToString().Trim('‹', '›').Replace( , )' จากนั้นฉันก็ใช้มัน ฉันไม่แน่ใจว่าการแยกวิเคราะห์ต้องการสิ่งนี้ แต่ฉันทำอย่างนั้น ฉันพยายามเก็บวงเล็บเหลี่ยมและช่องว่างไว้ แต่ยังคงได้รับข้อผิดพลาดเดิม - person user123; 30.06.2014

หลังจากพบร่องรอยและข้อผิดพลาดเพิ่มเติม ฉันพบว่าการแทนที่สิ่งนี้

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

แก้ไขปัญหาได้แล้ว ฉันไม่รู้ว่าทำไมเหมือนกัน

person user123    schedule 03.07.2014

คุณไม่ควรโทรไปล้างก่อนปิดสตรีมใช่ไหม?

requestWriter.Write(result, 0, result.Length);
requestWriter.Close();
person Dean Chalk    schedule 30.06.2014
comment
เพิ่มแล้ว แต่ยังคงได้รับข้อยกเว้น ฉันกำลังพยายามเข้าถึงเนื้อหาของการตอบกลับจากฟิลด์การตอบกลับข้อยกเว้นในแผงท้องถิ่น แต่จนถึงขณะนี้ยังไม่ประสบความสำเร็จ - person user123; 30.06.2014
comment
ฉันสามารถแยกเนื้อหาของคำตอบ 'รหัส: 107, ข้อผิดพลาด: json ไม่ถูกต้อง' - person user123; 30.06.2014
comment
ทำไมไม่ใช้ DataContractJsonSerializer - msdn.microsoft.com/en-us/library/ - person Dean Chalk; 30.06.2014
comment
เนื่องจาก ServiceStack ดูเหมือนว่าจะทำงานได้ดี และฉันก็ใช้มันในส่วนอื่นของโปรเจ็กต์ด้วย - person user123; 30.06.2014