GOOGLE ADS

martes, 3 de mayo de 2022

Solicitud de publicación http de Flutter a un archivo PHP

Estoy usando Flutter para el desarrollo de aplicaciones móviles. Necesito hacer una solicitud POST a un archivo PHP para guardar datos en mi servidor MySQL. Sin embargo, verifico el código de estado de la solicitud y parece estar bien (200). Pero, la solicitud falla. Creo que en mi archivo PHP hay un problema porque no me gusta PHP. ¿Alguien puede decirme si el problema está en mi código Flutter o en PHP?

Insertar archivo PHP

<?php

require 'connect.php';
$kayitNo =$_POST['kayit_no'];
$stajTuru=$_POST['staj_turu'];
$yas=$_POST['yas'];
$doktor=$_POST['klinik_egitici'];
$cinsiyet=$_POST['cinsiyet'];
$sikayet=$_POST['sikayet'];
$ayiriciTani=$_POST['ayirici_tani'];
$kesinTani=$_POST['kesin_tani'];
$tedaviYontemi=$_POST['tedavi_yontemi'];
$etkilesimTuru=$_POST['etkilesim_turu'];
$kapsam=$_POST['kapsam'];
$gerceklestigiOrtam=$_POST['ortam'];
$status=$_POST['form_status'];
$tarih=$_POST['tarih'];
echo $kayitNo;
$query="INSERT INTO form_table(kayit_no, staj_turu, yas, klinik_egitici, cinsiyet, sikayet, ayirici_tani,
kesin_tani, tedavi_yontemi, etkilesim_turu, kapsam, ortam, form_status,tarih) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?) ";
$stmt =$conn->prepare($query);
$stmt->bind_param("ssssssssssssss",$kayitNo,$stajTuru,$yas,$doktor,$cinsiyet,$sikayet,$ayiriciTani,
$kesinTani,$tedaviYontemi,$etkilesimTuru,$kapsam,$gerceklestigiOrtam, $status,$tarih);
$stmt->execute();
$error = $conn->error();
if ( empty( $error ) ) {
http_response_code( 201 );
} else {
echo $error;
}
$stmt->close();
$conn->close();
?>

Método HTTP POST (Flutter-Dart)

Future insertFormToDatabase(FormData formData) async{
var url = Uri.parse("http://10.0.2.2/flutter/insert.php");
var response = await http.post(url,
headers: <String, String>{
'Content-Type': 'application/json; charset=UTF-8',
},
body:jsonEncode(formData.toMap())
);
if (response.statusCode == 201) {
print("request succ.");
return true;
} else {
print(response.statusCode);
print("request failed.");
return false;
} }

Resultado de la red Flutter DevTools

ingrese la descripción de la imagen aquí

Respuesta

<br />
<b>Warning</b>: Undefined array key "kayit_no" in <b>C:\xampp\htdocs\flutter\insert.php</b> on line <b>6</b><br />
<br />
<b>Warning</b>: Undefined array key "staj_turu" in <b>C:\xampp\htdocs\flutter\insert.php</b> on line <b>7</b><br />
<br />
<b>Warning</b>: Undefined array key "yas" in <b>C:\xampp\htdocs\flutter\insert.php</b> on line <b>8</b><br />
<br />
<b>Warning</b>: Undefined array key "klinik_egitici" in <b>C:\xampp\htdocs\flutter\insert.php</b> on line <b>9</b><br />
<br />
<b>Warning</b>: Undefined array key "cinsiyet" in <b>C:\xampp\htdocs\flutter\insert.php</b> on line <b>10</b><br />
<br />
<b>Warning</b>: Undefined array key "sikayet" in <b>C:\xampp\htdocs\flutter\insert.php</b> on line <b>11</b><br />
<br />
<b>Warning</b>: Undefined array key "ayirici_tani" in <b>C:\xampp\htdocs\flutter\insert.php</b> on line <b>12</b><br />
<br />
<b>Warning</b>: Undefined array key "kesin_tani" in <b>C:\xampp\htdocs\flutter\insert.php</b> on line <b>13</b><br />
<br />
<b>Warning</b>: Undefined array key "tedavi_yontemi" in <b>C:\xampp\htdocs\flutter\insert.php</b> on line <b>14</b><br />
<br />
<b>Warning</b>: Undefined array key "etkilesim_turu" in <b>C:\xampp\htdocs\flutter\insert.php</b> on line <b>15</b><br />
<br />
<b>Warning</b>: Undefined array key "kapsam" in <b>C:\xampp\htdocs\flutter\insert.php</b> on line <b>16</b><br />
<br />
<b>Warning</b>: Undefined array key "ortam" in <b>C:\xampp\htdocs\flutter\insert.php</b> on line <b>17</b><br />
<br />
<b>Warning</b>: Undefined array key "form_status" in <b>C:\xampp\htdocs\flutter\insert.php</b> on line <b>18</b><br />
<br />
<b>Warning</b>: Undefined array key "tarih" in <b>C:\xampp\htdocs\flutter\insert.php</b> on line <b>19</b><br />
<br />
<b>Fatal error</b>: Uncaught mysqli_sql_exception: Column 'kayit_no' cannot be null in C:\xampp\htdocs\flutter\insert.php:28
Stack trace:
#0 C:\xampp\htdocs\flutter\insert.php(28): mysqli_stmt-&gt;execute()
#1 {main}
thrown in <b>C:\xampp\htdocs\flutter\insert.php</b> on line <b>28</b><br />


Solución del problema

¿Me lo estoy perdiendo? Parece que olvidaste agregar $stmt->execute();tu código PHP. Iría después $stmt->bind_param(...);y antes $stmt->close();. Preparó la declaración pero nunca la ejecutó. Esa podría ser la razón por la que no va a la base de datos.

Para devolver un 201 en caso de éxito, puede intentar esto justo después $stmt->execute();:

$error = $conn->error();
if ( empty( $error ) ) {
http_response_code( 201 );
} else {
// However you want to handle an error. Maybe echo $error here?
}

Problema con la aplicación del servidor blazor con autenticación de Azure AD que llama a una API web segura con un token de portador

Creé una API web que requiere autorización y se implementa en una aplicación web de Azure. También tengo una aplicación Blazor Server que requiere autenticación de Azure AD.

Cuando ejecuto la aplicación Blazor Server desde Visual Studio, puede obtener un token y llamar correctamente a la API web implementada en Azure.

Sin embargo, cuando implemento la aplicación Blazor Server en una aplicación web de Azure, aparece un error 401 cuando llama a la API web, a pesar de que funcionó desde Visual Studio.

Así es como configuro el token antes de la llamada a la API web

 var accessToken = await _authRepo.PrepareAuthenticatedClient();
_client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);

incluyendo también una captura de la excepción

@inject MicrosoftIdentityConsentAndConditionalAccessHandler ConsentHandler

 catch (Exception ex)
{
ConsentHandler.HandleException(ex);
}

Este procedimiento obtiene un token para el usuario que inició sesión para el alcance de la API web:

public async Task<string> PrepareAuthenticatedClient()
{
var accessToken = await _tokenAcquisition.GetAccessTokenForUserAsync(new[] { _WPScope });
return accessToken;
}

Este es el código en el archivo startup.cs

 public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApp(Configuration.GetSection("AzureAd"))
.EnableTokenAcquisitionToCallDownstreamApi(new string[] { "api://xxxxxxxxxxxxxxxxxxxxxx/allaccess" })
.AddInMemoryTokenCaches();
services.AddControllersWithViews(options =>
{
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
options.Filters.Add(new AuthorizeFilter(policy));
}).AddMicrosoftIdentityUI();


¿Cómo configuro esto en Azure para que funcione como lo hace en Visual Studio?


Solución del problema

Por favor, intente estos:

  • Después de descodificar el token, si ve la URL del emisor con el punto de conexión v2, asegúrese de cambiar la versión aceptada del token de acceso a 2 en el manifiesto en Azure Ad Portal, si el valor iss tiene un cambio de punto de conexión v1 en el manifiesto a 1.

  • Además, si lo anterior no es la causa, vea si la audiencia, es decir; aud reclamación es igual a la identificación del cliente. De lo contrario, intente cambiar el alcance al no incluir el prefijo api://.

  • Y también asegúrese de que los permisos de la API tengan el consentimiento.

    Cable Laravel Livewire: haga clic en no disparar

    Estoy trabajando en una plataforma de comercio electrónico basada en Laravel y Livewire usando el carrito de compras bumbummen99. Mi problema es que solo puedo agregar artículos al carrito, pero por alguna razón no puedo actualizar (aumentar o disminuir) la cantidad, eliminar un artículo del carrito. No tengo ningún error en la consola, no hay actividad de red al hacer clic en cualquiera de los botones. He comprobado que todo el HTML está encerrado en uno <div>. Revisé un par de otras páginas ( aquí, aquí, aquí ) pero no tuve suerte. También intenté cambiar el cable que no funciona: haga clic para seguir el formato del cable: haga clic en agregar al carrito que funciona, eso tampoco ayudó. Cualquier ayuda es muy apreciada.

    Aquí está mi tabla de listado de productos

    @extends('layouts.app')
    @section('template_linked_css')
    <link href="{{asset('front/css/cart.css')}}" rel="stylesheet">
    @endsection
    @section('content')
    <main class="bg_gray">
    @livewire('cart-listing')
    </main>
    @endsection

    Aquí está mi componente CartListing:

    use App\Models\Service;
    use Gloudemans\Shoppingcart\Facades\Cart;
    use Livewire\Component;
    class CartListing extends Component
    {
    public $products;
    public array $quantity = [];
    public function mount()
    {
    $this->products = Cart::content();
    foreach ($this->products as $product) {
    $this->quantity[$product->id] = 1;
    }
    }
    public function addToCart($product_id)
    {
    $product = Product::findOrFail($product_id);
    Cart::add(
    $product->id,
    $product->name,
    $this->quantity[$product_id],
    $product->price
    );
    $this->emit('cart_updated');
    }
    public function increase($rowId){
    Cart::update($rowId, 1);
    $this->emit('cart_updated');
    }
    public function decrease($rowId){
    Cart::update($rowId, -1);
    $this->emit('cart_updated');
    }
    public function deleteItem($rowId){
    Cart::remove($rowId);
    $this->emit('cart_updated');
    }
    public function render()
    {
    $cart = Cart::content();
    $cart_count = Cart::content()->count();
    $cart_total = Cart::subtotal();
    return view('livewire.cart-listing', compact('cart', 'cart_count', 'cart_total'));
    }
    }

    Aquí está mi vista de lista de carritos de Livewire:

    <div>
    <div class="container margin_30">
    <div class="page_header">
    <div class="breadcrumbs">
    <ul>
    <li><a href="#">Home</a></li>
    <li>Cart</li>
    </ul>
    </div>
    <h1>Cart</h1>
    </div>
    <!-- /page_header -->
    <table class="table table-striped cart-list">
    <thead>
    <tr>
    <th>
    Product
    </th>
    <th>
    Price
    </th>
    <th>
    Quantity
    </th>
    <th>
    Subtotal
    </th>
    <th>
    </th>
    </tr>
    </thead>
    <tbody>
    @forelse ($products as $product)
    <tr>
    <td>
    <div class="thumb_cart">
    <img src="{{asset('front/img/products/product_placeholder_square_small.jpg')}}" data-src="{{asset('front/img/products/shoes/1.jpg')}}" class="lazy" alt="Image">
    </div>
    <span class="item_cart">{{$product->name}}</span>
    </td>
    <td>
    <strong>£ {{$product->price}}</strong>
    </td>
    <td>
    <div class="numbers-row">
    <input type="text" value="{{$product->qty}}" id="quantity_1" class="qty2" name="quantity_1">
    <div wire:click="increase({{$product->rowId}})" class="inc button_inc">+</div>
    <div wire:click="decrease({{$product->rowId}})" class="dec button_inc">-</div>
    </div>
    </td>
    <td>
    <strong>£ {{number_format($product->price * $product->qty, 2,'.',',')}}</strong>
    </td>
    <td class="options">
    <a wire:click="deleteItem({{$product->rowId}})"><i class="ti-trash"></i></a>
    </td>
    </tr>
    @empty
    <tr>
    <td colspan="3">
    <span class="item_cart">Your cart is empty</span>
    </td>
    </tr>
    @endforelse
    </tbody>
    </table>
    </div>
    <!-- /container -->
    <div class="box_cart">
    <div class="container">
    <div class="row justify-content-end">
    <div class="col-xl-4 col-lg-4 col-md-6">
    <ul>
    <li>
    <span>Subtotal</span> $ {{$cart_total}}
    </li>
    <li>
    <span>Total</span> $ {{$cart_total}}
    </li>
    </ul>
    <a href="cart-2.html" class="btn_1 full-width cart">Proceed to Checkout</a>
    </div>
    </div>
    </div>
    </div>

    </div>

    Mi layouts.app también tiene los enlaces livewire:

    <head>
    @livewireStyles
    </head>
    <body >
    @livewireScripts
    </body>


    Solución del problema

    Si está pasando una cadena al wire:clickmétodo, debe encapsularla con comillas simples como esta

    wire:click="increase('{{$product->rowId}}')"

    Replaykit - La grabación no comienza Error- 5803

    Quiero empezar a grabar en mi App, estoy usando ReplayKit

    func startRecordn(){
    recorder.startRecording{ [unowned self] (error) in
    //2
    guard error == nil else {
    print("There was an error starting the recording.")
    return
    }
    //3
    print("Started Recording Successfully")
    }
    }

    Cada vez que me sale el error

    Domain=com.apple.ReplayKit.RPRecordingErrorDomain Code=-5803 "Error al iniciar la grabación" UserInfo={NSLocalizedDescription=Error al iniciar la grabación} Hubo un error al iniciar la grabación.


    Solución del problema

    Finalmente encontré el problema, en mi AppDelegate, debajo del problema creado por el código, lo comenté y obtuve el aviso de permiso

     if #available(iOS 13, *) {
    window = UIWindow(frame: UIScreen.main.bounds)

    Llamada de cierre con argumentos no coincidentes: función '_TaskTileState.checkboxCallback'

    Estoy recibiendo este error en mi código

    ======== Exception caught by widgets library =======================================================
    The following NoSuchMethodError was thrown building TaskCheckbox(dirty):
    Closure call with mismatched arguments: function '_TaskTileState.checkboxCallback'
    Receiver: Closure: (bool) => void from Function 'checkboxCallback':.
    Tried calling: _TaskTileState.checkboxCallback()
    Found: _TaskTileState.checkboxCallback(bool) => void
    The relevant error-causing widget was:
    TaskCheckbox TaskCheckbox:file:///F:/Code/Flutter/todoey_flutter/lib/widgets/task_tile.dart:28:17
    When the exception was thrown, this was the stack:
    #0 Object.noSuchMethod (dart:core-patch/object_patch.dart:63:5)
    #1 _objectNoSuchMethod (dart:core-patch/object_patch.dart:106:9)
    The relevant error-causing widget was:
    TaskCheckbox TaskCheckbox:file:///F:/Code/Flutter/todoey_flutter/lib/widgets/task_tile.dart:28:17
    When the exception was thrown, this was the stack:
    #0 Object.noSuchMethod (dart:core-patch/object_patch.dart:63:5)
    #1 _objectNoSuchMethod (dart:core-patch/object_patch.dart:106:9)

    Aquí está mi código que a través de este error

     // ignore_for_file: prefer_const_constructors
    import 'package:flutter/material.dart';
    class TaskTile extends StatefulWidget {
    @override
    State<TaskTile> createState() => _TaskTileState();
    }
    class _TaskTileState extends State<TaskTile> {
    bool isChecked = false;
    void checkboxCallback(bool checkboxState) {
    setState(() {
    isChecked = checkboxState;
    });
    }
    @override
    Widget build(BuildContext context) {
    return ListTile(
    title: Text(
    'This is task',
    style: TextStyle(
    decoration: isChecked? TextDecoration.lineThrough: null,
    ),
    ),
    trailing: TaskCheckbox(isChecked, checkboxCallback),
    );
    }
    }
    class TaskCheckbox extends StatelessWidget {
    final bool checkboxState;
    final Function toggleCheckboxState;
    TaskCheckbox(this.checkboxState, this.toggleCheckboxState);
    @override
    Widget build(BuildContext context) {
    return Checkbox(
    activeColor: Colors.lightBlueAccent,
    value: checkboxState,
    onChanged: toggleCheckboxState(),
    );
    }
    }

    Estoy tratando de crear un estado global para intercambiar datos entre dos clases diferentes y cambiar el estado en la pantalla.


    • esta es una aplicación de gestión de tareas en la que obtengo los datos de una variable estática. Quiero intercambiar valores booleanos entre dos clases y mostrar la lista de tareas de acuerdo con ese valor booleano.*
      ¿Puede alguien ayudarme con esto?



    Solución del problema

    import 'package:flutter/material.dart';
    class TaskTile extends StatefulWidget {
    @override
    State<TaskTile> createState() => _TaskTileState();
    }
    class _TaskTileState extends State<TaskTile> {
    bool isChecked=false;
    void CheckBoxCallback(bool? checkboxstate){
    setState(() {
    isChecked = checkboxstate!;
    });
    }
    @override
    Widget build(BuildContext context) {
    return ListTile(
    title: Text('baking today',
    style: TextStyle(
    decoration: isChecked?TextDecoration.lineThrough:null),),
    trailing: TaskCheckBox(
    checkboxstate: isChecked,
    togglecheckboxstate: CheckBoxCallback,

    ),
    );
    }
    }
    class TaskCheckBox extends StatelessWidget {
    final bool checkboxstate;
    final Function(bool?)? togglecheckboxstate; // Here is where to make changes, observe the "bool?" i added.
    TaskCheckBox({required this.checkboxstate,required this.togglecheckboxstate});
    @override
    Widget build(BuildContext context) {
    return Checkbox(
    value: checkboxstate,
    onChanged:togglecheckboxstate, // and here too on your code
    );
    }
    }

    Creando miles de filas en la base de datos con Spring Data

    Tengo un servicio Spring Boot donde tenemos proyectos, colaboradores y una relación de muchos a muchos entre proyectos y colaboradores, esto se modela en JPA como 3 entidades separadas, Project, Contributor y ProjectContributor. Estoy usando Spring Data para interactuar con la base de datos que está en Postgres.

    Tras el consumo de un evento de SQS, hay momentos en los que tenemos que crear miles de proyectos en la base de datos junto con sus colaboradores. Estos proyectos y colaboradores son proporcionados por algunos servicios externos.

    En el escenario en el que tenemos que crear 1000 proyectos y cada proyecto tiene un promedio de 2 colaboradores, realizo las siguientes llamadas a la base de datos a través de los métodos de guardado del repositorio Spring Data para cada entidad.

    1000 llamadas al método ProjectRespository.save() para crear proyectos

    2000 llamadas al método ContributorRespository.save() para crear colaboradores

    2000 llamadas al método ProjectContributorRespository.save() para asociar colaboradores a proyectos

    Y ni siquiera estoy contando que antes de crear un colaborador, tengo que emitir una consulta para verificar si el colaborador ya existe en la base de datos.

    Todo esto está dentro de un método @Transactional. Esta lógica tarda una eternidad en completarse, me preguntaba cuál es el mejor enfoque para hacer algo como esto en Spring Boot y Spring Data para reducir significativamente la cantidad de llamadas a la base de datos para crear los objetos mencionados anteriormente.


    Solución del problema

    Esto suena como una buena opción para el procesamiento por lotes de inserciones. En pocas palabras, puede realizar muchas inserciones en un viaje de ida y vuelta de DB. El procesamiento por lotes es configurable por la propiedad hibernate.jdbc.batch_size. Vale la pena señalar que el lote se dirige solo a una tabla. Entonces, 5 inserciones en la tabla Project, 5 en Contributor, luego, una vez más, 5 en Project y 5 en Contributor se realizarán en 4 lotes. Es mejor hacer 10 inserciones en Project y 10 en Contributor u ordenar las inserciones a través de la propiedad hibernate.order_inserts. Entonces solo tiene 2 viajes de ida y vuelta de DB en el caso mencionado anteriormente. Puede leer más sobre esto en https://vladmihalcea.com/how-to-batch-insert-and-update-statements-with-hibernate/.

    ¿Cómo agregar un meta/comentario a una secuencia definida a través de def en Clojure?

    Tuve que comentar la línea a continuación (el ejemplo es de http://en.wikibooks.org/wiki/Clojure_Programming/Examples/Lazy_Fibonacci )

    (def fib-seq
    ;"Implements Fibonacci sequence (starts with 0)."
    ((fn rfib [a b]
    (lazy-seq (cons a (rfib b (+ a b)))))
    0 1))

    Si lo dejara dentro, obtendría:

    Clojure 1.2.0
    java.lang.Exception: Too many arguments to def (Problem1.clj:1)
    1:1 user=>

    Puedo hacer esto con defn, sin embargo. Ejemplo (lo sé, estoy reinventando la rueda porque even?ya está definido):

    (defn is-even? [n]
    "Returns true if the number is even, false otherwise."
    (== (mod n 2) 0))
    Clojure 1.2.0
    1:1 user=> (is-even? 3)
    false
    1:2 user=> (is-even? 4)
    true
    1:3 user=>


    Solución del problema

    (def ^{:doc "Implements Fib. sequence lazily."} fibs...)

    (:doc (meta (var fibs)))

    ; "Implements Fib. sequence lazily."

    Es bastante simple escribir una macro para que puedas escribir (def-with-docs foo "doc" 1).

    (defmacro def-with-docs [name docstring value]
    `(def ~(with-meta name {:doc docstring}) ~value))
    (def-with-docs fib-seq "Implements Fibbonaci sequence (starts with 0)."
    ((fn rfib [a b] (lazy-seq (cons a (rfib b (+ a b))))) 0 1))

    (:doc (meta (var fib-seq)))

    ; "Implements Fibbonaci sequence (starts with 0)."

    Además, tenga en cuenta que con su ejemplo de uso de defn, la cadena de documentación debe preceder a los argumentos; de lo contrario, no se asociará con los metadatos del símbolo.

    Alternativamente, se puede usar clojure.contrib.def/defvar.

    Regla de Firestore para acceder a la generación de subcolección Permisos faltantes o insuficientes

    Tengo problemas con las reglas de Firestore para permitir el acceso a algunos recursos en una subcolección. Tengo algunos requests document...