2010-03-06 12 views

Respuesta

16

Básicamente. ..

using System; 
using System.IO; 
using System.Net; 
using System.Text; 

namespace Examples.System.Net 
{ 
    public class WebRequestPostExample 
    { 
     public static void Main() 
     { 
      // Create a request using a URL that can receive a post. 
      WebRequest request = WebRequest.Create ("https://go.urbanairship.com/api/push/"); 
      // Set the Method property of the request to POST. 
      request.Method = "POST"; 

      // Create POST data and convert it to a byte array. 

estallado en varias líneas para que pueda leerlo

  string postData = "{ 
    "device_tokens": [ 
     "some device token", 
     "another device token" 
    ], 
    "aliases": [ 
     "user1", 
     "user2" 
    ], 
    "tags": [ 
     "tag1", 
     "tag2" 
    ], 
    "schedule_for": [ 
     "2010-07-27 22:48:00", 
     "2010-07-28 22:48:00" 
    ], 
    "exclude_tokens": [ 
     "device token you want to skip", 
     "another device token you want to skip" 
    ], 
    "aps": { 
     "badge": 10, 
     "alert": "Hello from Urban Airship!", 
     "sound": "cat.caf" 
    } 
}"; 

y luego

  byte[] byteArray = Encoding.UTF8.GetBytes (postData); 
      // Set the ContentType property of the WebRequest. 
      request.ContentType = "application/json"; 
      // Set the ContentLength property of the WebRequest. 
      request.ContentLength = byteArray.Length; 

      //Do a http basic authentication somehow 
      string username = "<application key from urban airship>"; 
      string password = "<master secret from urban airship>"; 
      string usernamePassword = username + ":" + password; 
      CredentialCache mycache = new CredentialCache(); 
      mycache.Add(new Uri("https://go.urbanairship.com/api/push/"), "Basic", new NetworkCredential(username, password)); 
      request.Credentials = mycache; 
      request.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(new ASCIIEncoding().GetBytes(usernamePassword))); 

      // Get the request stream. 
      Stream dataStream = request.GetRequestStream(); 
      // Write the data to the request stream. 
      dataStream.Write (byteArray, 0, byteArray.Length); 
      // Close the Stream object. 
      dataStream.Close(); 
      // Get the response. 
      WebResponse response = request.GetResponse(); 
      // Display the status. 
      Console.WriteLine (((HttpWebResponse)response).StatusDescription); 
      // Get the stream containing content returned by the server. 
      dataStream = response.GetResponseStream(); 
      // Open the stream using a StreamReader for easy access. 
      StreamReader reader = new StreamReader (dataStream); 
      // Read the content. 
      string responseFromServer = reader.ReadToEnd(); 
      // Display the content. 
      Console.WriteLine (responseFromServer); 
      // Clean up the streams. 
      reader.Close(); 
      dataStream.Close(); 
      response.Close(); 
     } 
    } 
} 

Ver api docs, msdn y here for more on https

+2

¡Gran respuesta, SLF! – Jann

11

La respuesta aceptada no funciona, es necesario cambiar la línea siguiente:

request.ContentType = "application/x-www-form-urlencoded"; 

a

request.ContentType = "application/json"; 

código de trabajo completo se muestra a continuación:

using System; 
using System.IO; 
using System.Net; 
using System.Text; 

namespace UrbanAirship_Tes_1 
{ 
    class Program 
    { 
     public static void Main() 
     { 

      // Create a request using a URL that can receive a post. 
      WebRequest request = WebRequest.Create("https://go.urbanairship.com/api/push/"); 
      request.Credentials = new NetworkCredential("pvYMExk3QIO7p2YUs6BBkg", "rO3DsucETRadbbfxHkd6qw"); 
      // Set the Method property of the request to POST. 
      request.Method = "POST"; 
      // Create POST data and convert it to a byte array. 
      //WRITE JSON DATA TO VARIABLE D 
      string postData = "{\"aps\": {\"badge\": 1, \"alert\": \"Hello from Urban Airship!\"}, \"device_tokens\": [\"6334c016fc643baa340eca25bc661d15055a07b475e9a6108f3f644b15dd05ac\"]}"; 
      byte[] byteArray = Encoding.UTF8.GetBytes(postData); 
      // Set the ContentType property of the WebRequest. 
      request.ContentType = "application/json"; 
      // Set the ContentLength property of the WebRequest. 
      request.ContentLength = byteArray.Length; 
      // Get the request stream. 
      Stream dataStream = request.GetRequestStream(); 
      // Write the data to the request stream. 
      dataStream.Write(byteArray, 0, byteArray.Length); 
      // Close the Stream object. 
      dataStream.Close(); 
      // Get the response. 
      WebResponse response = request.GetResponse(); 
      // Display the status. 
      //   Console.WriteLine(((HttpWebResponse)response).StatusDescription); 
      // Get the stream containing content returned by the server. 
      dataStream = response.GetResponseStream(); 
      // Open the stream using a StreamReader for easy access. 
      StreamReader reader = new StreamReader(dataStream); 
      // Read the content. 
      string responseFromServer = reader.ReadToEnd(); 
      // Display the content. 
      Console.WriteLine(responseFromServer); 
      // Clean up the streams. 
      reader.Close(); 
      dataStream.Close(); 
      response.Close(); 
     } 
    } 
} 
+0

guau la respuesta funcionó. Mire que soy nuevo y quiero lo mismo, quiero enviar datos a aplicaciones que son iphone, android y blackberry. Soy un desarrollador web que trabaja en sebservicio que generará mensajes de inserción para las aplicaciones del cliente. – LojiSmith

+0

esta respuesta funcionó bt con el siguiente error. – LojiSmith

+1

de su código, acabo de cambiar el nombre de usuario y la contraseña de la línea de red. {System.Net.WebException: el servidor remoto devolvió un error: (401) No autorizado. en System.Net.HttpWebRequest.GetResponse() en ConsoleApplication1.Program.Main (String [] args) en c: \ Users \ Window8 \ Downloads \ urban-airship-windows-latest \ urban-airship-windows-1_0_1_0 \ ConsoleApplication1 \ Program.cs: line 38} – LojiSmith

1
public class PushNotificationHelper 
{ 
    private readonly ILog log4netEngine; 

    private string UrbanAirshipApplicationKey { get; set; } 
    private string UrbanAirshipApplicationSecret { get; set; } 
    private string UrbanAirshipApplicationMasterSecret { get; set; } 

    public PushNotificationHelper(string UrbanAirshipApplicationKey, string UrbanAirshipApplicationSecret, string UrbanAirshipApplicationMasterSecret) 
    { 
     log4netEngine = LogManager.GetLogger(typeof(PushNotificationHelper).Name); 

     this.UrbanAirshipApplicationKey = UrbanAirshipApplicationKey; 
     this.UrbanAirshipApplicationSecret = UrbanAirshipApplicationSecret; 
     this.UrbanAirshipApplicationMasterSecret = UrbanAirshipApplicationMasterSecret; 
    } 


    public void PushNotification2iPhones(string alertText, string[] apids, string extra) 
    { 
     if (!string.IsNullOrEmpty(alertText) && apids.Length > 0) 
     { 
      iPhonePushNotification pushNotification = new iPhonePushNotification 
      { 
       MessageBody = new iPhonePushNotificationMessageBody 
       { 
        Alert = alertText 
       }, 
       Extra = extra, 
       APIDs = apids 
      }; 
      string jsonMessageRequest = pushNotification.ToJsonString(); 
      try 
      { 
       SendMessageToUrbanAirship(jsonMessageRequest); 
       log4netEngine.InfoFormat("Push Notification Success , iPhoneDevice:{0}, message:{1},extra:{2}", string.Join(",", apids), alertText, extra); 
      } 
      catch (Exception ex) 
      { 
       log4netEngine.InfoFormat("Push Notification Error:{0}, iPhoneDevice:{1}, message:{2},extra:{3}", ex.Message, string.Join(",", apids), alertText, extra); 
      } 
     } 
    } 


    public void PushNotification2Androids(string alertText, string[] apids, string extra) 
    { 
     if (!string.IsNullOrEmpty(alertText) && apids.Length > 0) 
     { 
      AndroidPushNotification pushNotification = new AndroidPushNotification 
      { 
       MessageBody = new AndroidPushNotificationMessageBody 
       { 
        Alert = alertText, 
        Extra = extra 
       }, 
       APIDs = apids 
      }; 
      string jsonMessageRequest = pushNotification.ToJsonString(); 

      try 
      { 
       SendMessageToUrbanAirship(jsonMessageRequest); 
       log4netEngine.InfoFormat("Push Notification Success , androidDevice:{0}, message:{1},extra:{2}", string.Join(",", apids), alertText, extra); 
      } 
      catch (Exception ex) 
      { 
       log4netEngine.InfoFormat("Push Notification Error:{0}, androidDevice:{1}, message:{2},extra:{3}", ex.Message, string.Join(",", apids), alertText, extra); 
      } 
     } 
    } 

    private void SendMessageToUrbanAirship(string jsonMessageRequest) 
    { 
     var uri = new Uri("https://go.urbanairship.com/api/push/"); 
     var encoding = new UTF8Encoding(); 
     var request = WebRequest.Create(uri); 
     request.Method = "POST"; 
     request.Credentials = new NetworkCredential(this.UrbanAirshipApplicationKey, this.UrbanAirshipApplicationMasterSecret); 
     request.ContentType = "application/json"; 
     request.ContentLength = encoding.GetByteCount(jsonMessageRequest); 
     using (var stream = request.GetRequestStream()) 
     { 
      stream.Write(encoding.GetBytes(jsonMessageRequest), 0, encoding.GetByteCount(jsonMessageRequest)); 
      stream.Close(); 
      var response = request.GetResponse(); 
      response.Close(); 
     } 
    } 
} 

public class NotificationToPush 
{ 
    public int ReceiverUserID { get; set; } 
    public string Message { get; set; } 
    public Dictionary<string, string> Extra { get; set; } 
} 

[DataContract(Name = "PushNotificationBody")] 
internal class PushNotification 
{ 
    public string ToJsonString() 
    { 
     var result = JsonConvert.SerializeObject(this); 
     return result; 
    } 
} 

[DataContract(Name = "iPhonePushNotification")] 
internal class iPhonePushNotification : PushNotification 
{ 
    [DataMember(Name = "aps")] 
    public iPhonePushNotificationMessageBody MessageBody { get; set; } 

    [DataMember(Name = "extra")] 
    public string Extra { get; set; } 

    [DataMember(Name = "device_tokens")] 
    public string[] APIDs { get; set; } 
} 

[DataContract(Name = "iPhonePushNotificationMessageBody")] 
internal class iPhonePushNotificationMessageBody 
{ 
    [DataMember(Name = "alert")] 
    public string Alert { get; set; } 
} 

[DataContract(Name = "AndroidPushNotification")] 
internal class AndroidPushNotification : PushNotification 
{ 
    [DataMember(Name = "android")] 
    public AndroidPushNotificationMessageBody MessageBody { get; set; } 

    [DataMember(Name = "apids")] 
    public string[] APIDs { get; set; } 
} 

[DataContract(Name = "AndroidPushNotificationMessageBody")] 
internal class AndroidPushNotificationMessageBody 
{ 
    [DataMember(Name = "alert")] 
    public string Alert { get; set; } 

    [DataMember(Name = "extra")] 
    public string Extra { get; set; } 
} 
0

Aquí es cómo hacerlo utilizando los métodos System.Net.Http.HttpClient asincrónicos.

var handler = new HttpClientHandler { Credentials = new NetworkCredential(urbanairshipapiKey, urbanairshipApiAppMasterSecret) }; 
var client = new HttpClient(handler); 
var added = client.DefaultRequestHeaders.TryAddWithoutValidation("Accept", "application/vnd.urbanairship+json; version=3;"); 

var response = await client.PostAsync(apiUrl + "/push/", new StringContent(json, Encoding.UTF8, "application/json")); 
Cuestiones relacionadas