2017-07-19 6 views
6

Ich versuche eine einfache Azure-Funktion zu erstellen, um mehr darüber zu erfahren. Es wird 3 Funktionen geben:Wie übergibt man Parameter per POST an eine Azure-Funktion?

  • 1 Funktion zum Einfügen einer Zeile in eine Tabelle einer Datenbank. Diese Tabelle enthält das aktuelle Datum und einen String-Parameter, der vom Benutzer eingegeben und von GET übergeben wurde.
  • 1 Funktion ähnlich der vorherigen, aber Übergabe des Parameters durch POST.
  • 1 Funktion zum Lesen der Tabelle und zeigen ihren Inhalt.

Ich war in der Lage, die ersten und dritten zu tun. Aber ich kann den Parameter nicht per POST übergeben. Ich habe nach Beispielen gesucht, aber ich konnte sie nicht erfolgreich führen. Die Client-App ist eine Windows Forms-Anwendung.

Kann mir jemand ein Beispiel zeigen und wie man Parameter per POST an die Funktion weitergibt und wie man sie liest?

Dankten im Voraus

EDIT:

Hier ist der Code, um die Parameter von GET übergeben (dies funktioniert gut):

private void button2_Click(object sender, EventArgs e) 
{ 
    string cadena = lsql1.Text + "?notas=" + tNotas.Text; 

    try 
    { 
     HttpWebRequest req = (HttpWebRequest)WebRequest.Create(cadena); 
     HttpWebResponse res = (HttpWebResponse)req.GetResponse(); 

     if (res.StatusCode == HttpStatusCode.OK) 
     { 
      MessageBox.Show("Grabado"); 
     } 
     else 
     { 
      MessageBox.Show(res.StatusDescription); 
     } 
    }catch (WebException ex) 
    { 
     using (Stream s = ex.Response.GetResponseStream()) 
     { 
      StreamReader sr = new StreamReader(s); 
      string text = sr.ReadToEnd(); 
      text = text.Substring(1, text.Length - 2); 
      sr.Close(); 
      text = text.Replace("\\", ""); 
      text = "{" + text + "}"; 
      Error mensajeError = JsonConvert.DeserializeObject<Error>(text); 

      MessageBox.Show(mensajeError.ExceptionMessage); 
     } 

    } 
} 

Und hier ist der Code, um es zu empfangen, und tun das einfügen (das funktioniert auch):

[FunctionName("sql1")] 
public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log) 
{ 
    try 
    { 
     log.Info("C# HTTP trigger function processed a request."); 

     var cnnString = "Server=SERVIDOR;Database=base_prueba;User ID =azure;Password=0000;Trusted_Connection=False;Encrypt=False;"; 

     using (SqlConnection connection = new SqlConnection(cnnString)) 
     { 
      connection.Open(); 
      SqlCommand cmd = connection.CreateCommand(); 

      DateTime fecha = DateTime.Today; 

      string notas = req.GetQueryNameValuePairs() 
      .FirstOrDefault(q => string.Compare(q.Key, "notas", true) == 0) 
      .Value; 

      // insert a log to the database 
      cmd.CommandText = "INSERT INTO Prueba_Azure (fecha, notas) VALUES ('" + fecha.ToString() + "', '" + notas + "')"; 
      cmd.ExecuteNonQuery(); 
     } 

     // Get request body 
     dynamic data = await req.Content.ReadAsAsync<object>(); 

     return name == req.CreateResponse(HttpStatusCode.OK, "Done"); 
    } 
    catch (Exception ex) 
    { 
     HttpResponseMessage res = req.CreateErrorResponse(HttpStatusCode.InternalServerError, ex); 
     return res; 
    } 
} 

Wonach ich suche, ist zu t sein per POST

+0

schreiben Sie bitte Ihre bisherigen Funktionsbeispiele. In welcher Sprache schreiben Sie sie? Sie können Azure-Funktionen in JavaScript für Node.js, aber auch C# für ASP.NET schreiben: https://visualstudiomagazine.com/articles/2017/04/01/implementing-webhooks-azure-functions.aspx – Dai

+0

Sorry; Ich verwende C#, um die Apps zu codieren. Ich habe den Code hinzugefügt, den ich getan habe. – davidrgh

Antwort

7

Um den Anforderungsinhalt aus dem Anfragetext (Post-Anfrage) zu erhalten, könnten Sie req.Content.ReadAsAsync-Methode verwenden. Hier ist das Codebeispiel.

Beispiel Anfrage Körper.

{ 
    "name": "Azure" 
} 

Definieren Sie eine Klasse zum Deserialisieren der Post-Daten.

public class PostData 
{ 
    public string name { get;set; }  
} 

Holen Sie sich die Postdaten und zeigen Sie sie an.

PostData data = await req.Content.ReadAsAsync<PostData>(); 
log.Info("name:" + data.name); 

Clientseitiger Code zum Senden der Postanforderung.

HttpWebRequest req = (HttpWebRequest)WebRequest.Create("function-url"); 
req.Method = "POST"; 
req.ContentType = "application/json"; 
Stream stream = req.GetRequestStream(); 
string json = "{\"name\": \"Azure\" }"; 
byte[] buffer = Encoding.UTF8.GetBytes(json); 
stream.Write(buffer,0, buffer.Length); 
HttpWebResponse res = (HttpWebResponse)req.GetResponse(); 
0

Sie benötigen Daten an den Körper der Post-Anforderung zu befestigen und es richtig verarbeiten:

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log) { 
    // This reads your post request body into variable "data" 
    string data = await req.Content.ReadAsStringAsync(); 
    // Here you can process json into an object 
    dynamic parsed = JsonConvert.DeserializeObject(data); 

    return exitstring == null 
     ? req.CreateResponse(HttpStatusCode.BadRequest, "Something went wrong, sorry") 
     : req.CreateResponse(HttpStatusCode.OK); 
} 

Sie ein etwas anderes Beispiel herehere und die genaue Beispiel finden.

1

Die Abfragezeichenfolge (Name/Wert-Paare) wird standardmäßig im HTTP-Nachrichtentext einer POST-Anforderung und nicht als Abfragezeichenfolge gesendet. Die Methode GetQueryNameValuePairs analysiert die Abfragezeichenfolge und arbeitet standardmäßig nicht mit der POST-Anforderung.

Für die POST-Anfrage Sie etwas Ähnliches wie diese verwenden:

var content = request.Content; 
string contentInString = content.ReadAsStringAsync().Result; 
+0

Bitte beachten Sie, dass dieser Code NICHT produktionsbereit ist (Async Deadlocks) –

1

Für Gabe von Parametern wie POST-Anfrage, müssen Sie folgende Dinge tun:

  1. Make Json Modell der Parameter Das müssen Sie übergeben, z. B .:

    {"UserProfile":{ "UserId":"xyz1","FirstName":"Tom","LastName":"Hank" }} 
    
  2. Veröffentlichen Sie Ihr Datenmodell mit Client wie POSTMAN

    enter image description here

  3. Jetzt werden Sie die veröffentlichten Inhalte in HttpRequestMessage Körper bekommen, wird Beispielcode wie folgt:

    [FunctionName("TestPost")] 
    public static HttpResponseMessage POST([HttpTrigger(AuthorizationLevel.Function, "put", "post", Route = null)]HttpRequestMessage req, TraceWriter log) 
    { 
        try 
        { 
         //create redis connection and database 
         var RedisConnection = RedisConnectionFactory.GetConnection(); 
         var serializer = new NewtonsoftSerializer(); 
         var cacheClient = new StackExchangeRedisCacheClient(RedisConnection, serializer); 
    
         //read json object from request body 
         var content = req.Content; 
         string JsonContent = content.ReadAsStringAsync().Result; 
    
         var expirytime = DateTime.Now.AddHours(Convert.ToInt16(ConfigurationSettings.AppSettings["ExpiresAt"])); 
    
         SessionModel ObjModel = JsonConvert.DeserializeObject<SessionModel>(JsonContent); 
         bool added = cacheClient.Add("RedisKey", ObjModel, expirytime); //store to cache 
    
         return req.CreateResponse(HttpStatusCode.OK, "RedisKey"); 
        } 
        catch (Exception ex) 
        { 
         return req.CreateErrorResponse(HttpStatusCode.InternalServerError, "an error has occured"); 
        } 
    } 
    
Verwandte Themen