Diego,
Abaixo o seu exemplo com alguns ajustes para retornar a lista de itens de pedido de venda e não somente o primeiro item encontrado.
Fiz alterações para utilizar funções da lib, json do binário e assim facilitar a criação da API.
Deixei o código com diversos comentários para facilitar o entendimento, espero que ajude.
#include "protheus.ch"
#include "restful.ch"
//-------------------------------------------------------------------
/*/{Protheus.doc} Rest02Pw
Função dummy para geração de patch
Obs.: A criação dessa função não é obrigatória
@author Daniel Mendes
@since Jul 06, 2022
@version 1.0
/*/
//-------------------------------------------------------------------
user function Rest02Pw()
return
//-------------------------------------------------------------------
/*/{Protheus.doc} VENDAS1
Serviço REST de itens de pedido de venda
@author Daniel Mendes
@since Jul 06, 2022
@version 1.0
/*/
//-------------------------------------------------------------------
wsrestful Vendas1 description "Serviço REST para retorno de itens de pedido de venda."
wsdata vendas as string
//Você pode utilizar aqui o "path" e definir melhor em qual url o endpoint vai atender
wsmethod get description "Retorna itens do pedido de venda." wssyntax "/VENDAS1" // Método GET
end wsrestful
//-------------------------------------------------------------------
/*/{Protheus.doc} Get
Verbo GET, retorna os itens do pedido de venda
@return lRet, logical, indica sucesso na busca pelo pedido de venda
@author Daniel Mendes
@since Jul 06, 2022
@version 1.0
/*/
//-------------------------------------------------------------------
wsmethod GET wsreceive vendas wsservice Vendas1
local cNum as character
local lRet as logical
local jJson as json
local aItens as array
local cSC6Fil as character
local nIdxSC6 as numeric
cNum := self:vendas //Número do pedido
cSC6Fil := xFilial("SC6") //Filial da SC6, salvo em variável para evitar chamar a função em laço [performance]
nIdxSC6 := SC6->(indexOrd()) //Salvo o índice da SC6, pois vou alterar o mesmo para o dbSeek
SC6->(dbSetOrder(1)) //Altero o índice da SC6 para efetuar o dbSeek de acordo com o número do pedido de venda
if !Empty(cNum) .and. SC6->(dbSeek(cSC6Fil + cNum)) .and. SC6->C6_NUM == cNum
//Se encontrar o pedido, entro na geração do json de retorno
aItens := {} //Array para retornar não só o primeiro item, mas todos!
lRet := .T. //Se encontrei o pedido de venda, vou retornar verdadeiro
jJson := JsonObject():new() //Json nativo do ADVPL, bem fácil de usar
self:SetContentType("application/json")
//Faço o laço para pegar todos os itens do pedido de venda requisitado
while !SC6->(eof()) .and. SC6->C6_NUM == cNum .and. SC6->C6_FILIAL == cSC6Fil
//Uso a função que gera um json de um único item e adiciono ao array
aAdd(aItens, MntJSON(AllTrim(SC6->C6_NUM), SC6->C6_ITEM, SC6->C6_PRODUTO, SC6->C6_DESCRI, SC6->C6_VALOR, SC6->C6_QTDVEN))
SC6->(dbSkip()) //Próximo registro
enddo
//Tendo todos os itens em formato json dentro do array, posso utilizar o método set da JsonObject pare gerar um array de json
jJson:set(aItens)
//Converto o json para string e faço o set da resposta da API
self:setResponse(jJson:toJson())
else
//Se não encontrar o pedido de venda solicitado, o correto é gerar um erro, normalmente um código 4XX e retornar falso
lRet := .F.
setRestFault(404, FWHttpEncode("Pedido " + AllTrim(cNum) + " não localizado no pedidos de venda."))
endif
//Restura o índice da SC6
SC6->(dbSetOrder(nIdxSC6))
//Retorno o lRet, de acordo com o sucesso na busca do pedido de venda
return lRet
//-------------------------------------------------------------------
/*/{Protheus.doc} MntJSON
Monta e retorna um json de item de pedido de venda
@param cNum, character, número
@param cItem, character, item
@param cProduto, character, produto
@param cDescri, character, descrição
@param nValor, character, valor
@param nQuant, character, quantidade
@return jJson, json, dados do item do pedido de venda
@author Daniel Mendes
@since Jul 06, 2022
@version 1.0
/*/
//-------------------------------------------------------------------
static function MntJSON(cNum, cItem, cProduto, cDescri, nValor, nQuant)
local jJson as json
//Crio o json via JsonObject, muito mais simples!
jJson := JsonObject():new()
//Item estava repetido, então troquei para Numero
jJson["Numero"] := cNum
jJson["Item"] := cItem
jJson["Produto"] := cProduto
jJson["Descricao"] := cDescri
jJson["Valor"] := nValor
jJson["Quantidade"] := nQuant
return jJson
Documentações:
https://tdn.totvs.com/display/tec/Classe+JsonObject
https://tdn.totvs.com/display/framework/FWhttpEncode
https://tdn.totvs.com.br/display/framework/REST+ADVPL