FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Problemas con Request POST a Woocommerce
Buenos días,
Estoy intentando hacer una petición REST a Woocommerce, concretamente intentando actualizar stocks de la tienda. La conexión con la API la he conseguido hacer, de hecho hago peticiones GET sin problema, pero al hacer un POST siempre me da un error: Código:
'{"code":"rest_invalid_json","message":"Ha pasado un cuerpo JSON no v\u00e1lido.","data":{"status":400,"json_error_code":4,"json_error_message":"Syntax error"}}' Código:
{ "update": [ { "id": 11563, "stock_quantity": 20 } ] } Código:
procedure TdmoDataModule.ActualizarStockWordpress; var body: TJSONObject; updates: TJSONArray; product: TJSONObject; value: TJSONValue; s: string; lparam: TRESTRequestParameter; i: integer; // param: TJSONRequestParameter; begin qryArticulos.Close; qryArticulos.Open; qryArticulos.First; body := TJSONObject.Create; updates := TJSONArray.Create; try while not qryArticulos.Eof do begin product := TJSONObject.Create; product.AddPair('id', TJSONNumber.Create(qryArticulos.FieldByName('CODIGO').AsInteger)); product.AddPair('stock_quantity', TJSONNumber.Create(qryArticulos.FieldByName('STOCK_ACTUAL').AsInteger)); updates.AddElement(product); qryArticulos.Next; end; body.AddPair(TJSONPair.Create('update', updates)); showMessage(body.ToString); with dmoREST do begin RESTRequestProductsBatch.Params.Clear; RESTRequestProductsBatch.AddParameter(OAUTH_CONSUMER_KEY, OAUTH_CONSUMER_KEY_VALUE); RESTRequestProductsBatch.AddParameter(OAUTH_SIGNATURE_METHOD, OAUTH_SIGNATURE_METHOD_VALUE); RESTRequestProductsBatch.AddParameter(OAUTH_NONCE, OAuth1Authenticator1.nonce); RESTRequestProductsBatch.AddParameter(OAUTH_TIMESTAMP, OAuth1Authenticator1.timeStamp.DeQuotedString); RESTRequestProductsBatch.AddParameter(OAUTH_VERSION, OAUTH_VERSION_VALUE); s := OAuth1Authenticator1.SigningClass.BuildSignature(RESTRequestProductsBatch, OAuth1Authenticator1); RESTRequestProductsBatch.AddParameter(OAUTH_SIGNATURE, s); RESTRequestProductsBatch.AddBody(body); RESTRequestProductsBatch.Execute; showMessage(RESTResponseProductsBatch.Content); end; finally body.Free; end; end; Para hacer las peticiones GET tengo que añadir todos los parámetros que veis arriba por código, sino no funciona. Aquí he hecho lo mismo, y de hecho el error que me da no es de autenticación, sino que para ser que el error está en el JSON o en alguna propiedad del parámetro "body". He probado muchas combinaciones pero ninguna me ha dado resultado. A ver si alguien es capaz de echarme una mano. Muy agradecido, Xus |
#2
|
|||
|
|||
La solución a este problema ha sido añadir al fichero .htacces del servidor WEB donde está el wordpress el siguiente texto:
Código:
RewriteRule ^wp-json/.* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L] El problema venía dado al autenticar con auth1 a través de REST Debuger, la cabecera no llegaba completa y por tanto no había forma de validar acceso. Con esta linea de código permitimos la autorización básica y entonces si que ya podemos realizar los post y puts correspondientes. |
#3
|
|||
|
|||
Buenas tardes,
Tengo el mismo problema que Xus, pero la solución que aporta MicrodeltaAmpos no me funciona. No tengo ningún problema para hacer GET pero con un POST siempre me da un error u otro, cuando no el que el JSON no es válido es que la firma no coincide, pero no logro crear un artículo. Código:
OAuth1Authenticator1:=TOAuth1Authenticator.Create(self); OAuth1Authenticator1.ConsumerKey := ck; OAuth1Authenticator1.ConsumerSecret := cs; OAuth1Authenticator1.SigningClassName := 'TOAuth1SignatureMethod_HMAC_SHA1'; OAuth1Authenticator1.CallbackEndpoint := ''; Restclient1.BaseURL := miurlapi; RESTRequest1.Resource := 'products'; RESTRequest1.Method := TRESTRequestMethod.rmpost; RESTRequest1.AddParameter('oauth_consumer_key', ck); RESTRequest1.AddParameter('oauth_consumer_secret',cs); RESTRequest1.AddParameter('oauth_signature_method', 'HMAC-SHA1'); RESTRequest1.AddParameter('oauth_nonce', OAuth1Authenticator1.nonce); RESTRequest1.AddParameter('oauth_timestamp', OAuth1Authenticator1.timeStamp.DeQuotedString); RESTRequest1.AddParameter('oauth_version', '1.0'); s := OAuth1Authenticator1.SigningClass.BuildSignature(RESTRequest1,OAuth1Authenticator1); RESTRequest1.AddParameter('oauth_signature', s); RESTRequest1.Addbody(mijson.tostring); // tampoco con mijson ni con mijoson.tojson RESTRequest1.Execute; Si modifico el .htaccess como dice @MicrodeltaAmpos me da error de página no existe, es más incluso picando la url en el chrome me dice no mismo "Not Found" Se agradece mucho una ayuda. |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Mandar request a web | Furyxe | Internet | 2 | 20-12-2012 05:28:48 |
delphi5 TIdHTTP problemas para enviar variables post con acentos | ing_alsaac | Internet | 0 | 01-02-2011 22:11:36 |
invalid request BLR | TJose | Firebird e Interbase | 3 | 16-08-2008 17:15:24 |
problemas con dataset.post | barracuda | Tablas planas | 0 | 05-05-2006 23:13:08 |
IBDatase Insert Post Edit Post | ariefez | Firebird e Interbase | 4 | 12-10-2005 02:53:04 |
|