Olá,
Recentemente integramos a API de loja virtual da Tray com nosso software e alguns aspectos foram bem nebulosos, por isto quero dividir com vocês uma dica super útil para casos como este, onde é necessário realizar um HTTP PUT usando lib cUrl.
Segue o exemplo de código que demonstra o trecho mais importante:
FUNCTION Tray_UpdateEstoque( sku_id, nEstoque, access_token )
LOCAL cEndPoint := 'https://666.commercesuite.com.br/web_api/products/'+alltrim(str(sku_id))+'?access_token='+access_token
LOCAL cData := '{"Product": {"stock": '+ALLTRIM(STR(nEstoque))+'}}'
LOCAL curl
LOCAL nRet
LOCAL Buff
LOCAL Resp
IF !empty( curl := curl_easy_init() )
curl_easy_setopt( curl, HB_CURLOPT_HTTPHEADER, {"Content-Type:application/json"} )
curl_easy_setopt( curl, HB_CURLOPT_CUSTOMREQUEST, 'PUT')
curl_easy_setopt( curl, HB_CURLOPT_URL, cEndPoint )
curl_easy_setopt( curl, HB_CURLOPT_POSTFIELDS, cData )
curl_easy_setopt( curl, HB_CURLOPT_FOLLOWLOCATION, 1)
curl_easy_setopt( curl, HB_CURLOPT_DL_BUFF_SETUP )
curl_easy_setopt( curl, HB_CURLOPT_SSL_VERIFYPEER, 0 )
curl_easy_setopt( curl, HB_CURLOPT_SSL_VERIFYHOST, 0 )
nRet := curl_easy_perform( curl )
Buff := curl_easy_dl_buff_get( curl )
curl_easy_cleanup( curl )
IF (nRet == HB_CURLE_OK)
hb_jsonDecode( Buff, @Resp )
ENDIF
ELSE
RETURN .F.
ENDIF
IF !HB_ISHASH(Resp)
? Buff // Exibe na tela a mensagem de erro obtida
RETURN .F.
ENDIF
* Retorno em caso de sucesso (status code 200 ou 201)
nRet := Resp['code']
RETURN (nRet == 200 .OR. nRet == 201)
Em nosso caso utilizamos o compilador Harbour, mas, isto deve servir como base para você caso use outros compiladores.
Espero ter ajudado.