cURL - json e PHP

1. cURL - json e PHP

CASSIANO DE ARAUJO GUIMARÃES
cassianoag

(usa CentOS)

Enviado em 21/01/2023 - 01:03h

Estou desenvolvendo uma aplicação que passa cabeçalho no corpo do cURL. No postman funciona agora na minha aplicação PHP não. Não sei o que estou fazendo de errado. Já tentei de tudo e até o momento não tive sucesso. vai abaixo informação e código.

$ch = curl_init($url);
$data_array=array('dataIntegration' => '{"ano":"2022","sistema":"CTR"}');
$data=http_build_query($data_array);

curl_setopt($ch, CURLOPT_POST, TRUE);
// defina o conteúdo do envio como json
curl_setopt($ch, CURLOPT_HTTPHEADER, array('"cache-control: no-cache","content-type: application/x-www-form-urlencoded";Token: '.$valor_token));

// agora vamos anexar o corpo em formato json da sua requisição
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);//

// ative o recebimento de retorno da requisição
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

// agora vamos anexar o corpo em formato json da sua requisição
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);//

// ative o recebimento de retorno da requisição
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

// executa a requisição POST
echo $resultado = curl_exec($ch);

curl_close($ch);
echo '<pre>'.print_r(json_decode($resultado),true).'</pre>';


  


2. Re: cURL - json e PHP

Alexa Bolada
alexabolada

(usa Debian)

Enviado em 21/01/2023 - 01:03h

{
"error": {
"message": "We could not parse the JSON body of your request. (HINT: This likely means you aren't using your HTTP library correctly. The OpenAI API expects a JSON payload, but what was sent was not valid JSON. If you have trouble figuring out how to fix this, please send an email to support@openai.com and include any relevant code you'd like help with.)",
"type": "invalid_request_error",
"param": null,
"code": null
}
}



3. Re: cURL - json e PHP

CASSIANO DE ARAUJO GUIMARÃES
cassianoag

(usa CentOS)

Enviado em 21/01/2023 - 15:21h

Alex obrigado pelo retorno. Enviei o código incompleto sem o token. Minha dúvida é como o php trata esta passagem no 'dataIntegration' = '{"ano":"2022","sistema":"CTR"}' no corpo do cobeçalho CURLOPT_POSTFIELDS. Não sei como é feito este tratamento para enviar usando "content-type: application/x-www-form-urlencoded".


4. Re: cURL - json e PHP

Buckminster
Buckminster

(usa Debian)

Enviado em 23/01/2023 - 10:42h

Esta linha
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);//

tenta assim
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data, JSON_PRETTY_PRINT));

A constante JSON_PRETTY_PRINT só é necessária caso tu quiser formatar os dados, pode tentar com a linha assim também:
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));

Veja aqui as várias constantes JSON que o PHP fornece prontas:
https://www.php.net/manual/pt_BR/json.constants.php


________________________________________________
Always listen the Buck!


5. cURL - json e PHP

CASSIANO DE ARAUJO GUIMARÃES
cassianoag

(usa CentOS)

Enviado em 24/01/2023 - 04:51h

A versão do meu PHP 5.3.3 é inferior não suporta a constante JSON_PRETTY_PRINT pode ser um problema então? Existe outra forma de resolver isso sem instalar uma versão superior?


6. Re: cURL - json e PHP

Buckminster
Buckminster

(usa Debian)

Enviado em 24/01/2023 - 09:02h

cassianoag escreveu:

A versão do meu PHP 5.3.3 é inferior não suporta a constante JSON_PRETTY_PRINT pode ser um problema então? Existe outra forma de resolver isso sem instalar uma versão superior?


JSON_PRETTY_PRINT
Essa constante, no teu caso, acredito que não é tão necessária.
Já tentou utilizar ela mesmo assim e ver se dá um erro de constante não aceita?

Mas segue uma sugestão de código:

// Dados da requisição
$data=array('dataIntegration' => '{"ano":"2022","sistema":"CTR"}');

$ch = curl_init($url);

// Configurações da requisição
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
'Token: '.$valor_token
));
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));

// Executa a requisição POST
$resposta = curl_exec($ch);

// Verifica se ocorreu algum erro
if(curl_errno($ch)) {
echo 'Erro: ' . curl_error($ch);
}

// Fecha a sessão cURL
curl_close($ch);

// Imprimindo
$resultado = json_decode($resposta);
echo $resultado;

O http_build_query que tu usou não é necessário já que você informa que enviará a requisição através do método POST uma vez que CURLOPT_POST é verdadeiro (true). Desta forma, você pode passar em CURLOPT_POSTFIELDS tanto um array diretamente quanto uma string URL-like.
Quando você passa diretamente o array, o Content-type da requisição automaticamente será do tipo multipart/form-data, enquanto que se passar uma string será do tipo application/x-www-form-urlencoded.
O http_build_query transforma o array em um formato de querystring pronta para ser passada para uma URL. Ele vai transformar a sequência de chave-valor do array e separar por um &.
Exemplo:
https://www.vivaolinux.com.br/topico/PHP/cURL-json-e-PHP&ano:2022&sistema:CTR

https://www.php.net/manual/pt_BR/function.http-build-query.php

O CURLOPT_HTTPHEADER já trata os cabeçalhos.
Lembrando que, segundo o manual do PHP, as funções json_encode e json_decode só funcionam com UTF-8.



________________________________________________
Always listen the Buck!


7. cURL - json e PHP

CASSIANO DE ARAUJO GUIMARÃES
cassianoag

(usa CentOS)

Enviado em 24/01/2023 - 13:10h

Buckminster, Obrigado pelo seu retorno!

Fiz o que você orientou, mas deu erro de servidor emitido pela aplicação "Erro interno do Servidor". Retirei a opção http_build_query como você pediu. Quando insiro a informação a aplicação envia erro: {"code":"401","message":"Não autorizado!"} agora o tratamento do erro aparece desta forma não executa: Warning: curl_errno(): 2 is not a valid cURL handle resource in /var/www/html/siafic/freire/SincDeParaEscrituracao.php on line 78.

O que me deixa sem entender é que no postman funciona sem problema quando insiro no php dá erro não autorizado com o comando http_build_query.

Fiz aqui um teste e a página que recepciona o código que estou enviando em PHP no cabeçalho recebe o seguinte no POST O CORPO Array ( [dataIntegration] => {\"ano\":\"2022\",\"sistema\":\"CTR\"} ). Não sei se estes caracteres "\" interfere na aplicação que está recebendo o corpo. Se tiverem alguma sugestão entra em contato.

Código está desta forma:

$ch = curl_init($url);

$data_array=array('dataIntegration' => '{"ano":"2022","sistema":"CTR"}');

$data=http_build_query($data_array);

curl_setopt($ch, CURLOPT_HTTPHEADER, array('content-type: application/x-www-form-urlencoded;Token:'. $valor_token));

curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
echo $resultado = curl_exec($ch);

// encerra conexão e libera variável
curl_close($ch);
// Verifica se ocorreu algum erro
if(curl_errno($ch)) {
echo 'Erro: ' . curl_error($ch);
}

echo '<pre>'.print_r(json_decode($resultado),true).'</pre>';




8. cURL - json e PHP

CASSIANO DE ARAUJO GUIMARÃES
cassianoag

(usa CentOS)

Enviado em 24/01/2023 - 16:35h

4- A tua aplicação em PHP trabalha com XML ou JSON? Ou com os dois? Com Json.

5- A tua aplicação em PHP trabalha com alguma API em específico? Ela se conecta com alguma API em específico? Conecta com API especifico. O sistema que possuo vai acessar através do webservice passando inserções.

6- Como você está passando o POST para este arquivo do código em questão? Não entendi bem sua pergunta, mas Estou passando através do corpo através da array como informado acima. Passo a key e value só que o sistema que é de terceiro (não foi eu que fiz) não consegue autorizar minha requisição que estou enviando.

$data_array=array('dataIntegration' => '{"ano":"2022","sistema":"CTR"}');

Neste caso dataIntegration é a chave - '{"ano":"2022","sistema":"CTR"}' é o value. O post não consegue identificar.


9. Re: cURL - json e PHP

Buckminster
Buckminster

(usa Debian)

Enviado em 24/01/2023 - 16:39h

1- Esse erro Warning: curl_errno(): 2 is not a valid cURL handle resource in /var/www/html/siafic/freire/SincDeParaEscrituracao.php on line 78 é porque tu trocou a ordem das linhas que eu tinha colocado, daí não executa mesmo:

// encerra conexão e libera variável
curl_close($ch);
// Verifica se ocorreu algum erro
if(curl_errno($ch)) {
echo 'Erro: ' . curl_error($ch);
}

Tu alterou a ordem e fechou o $ch antes de verificar os erros.
O curl_close($ch); deve ficar depois das linhas de verificação dos erros.


Colocarei um código funcional que está em produção e se conecta a uma API, daí tu se baseia nele. Esse código está em um arquivo PHP que recebe o POST de outro arquivo PHP com html, css e javascript.
recipient-name é o ID e o name de um input text no html que fica no outro arquivo PHP.

$recipient = filter_input(INPUT_POST, 'recipient-name', FILTER_UNSAFE_RAW);
if(!empty($recipient)){
// URL para acessar a API
$url = 'https://api.exemplo.com/etc/etc';

// Recebe o texto do arquivo.php
$prompt = filter_input(INPUT_POST, 'recipient-name', FILTER_UNSAFE_RAW);

// Dados da requisição
$data = array(
'etc' => 'etc',
'prompt' => $prompt,
'etc' => 0,
'etc' => 200,
);

// Inicia a sessão cURL
$ch = curl_init($url);

// Caso for Linux
//$certificate_location = '/usr/local/openssl-0.9.8/certs/cacert.pem';

//Caso for Windows
$certificate_location = 'LocalMachine\My';
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, $certificate_location);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, $certificate_location);

// Configurações da requisição
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
'Authorization: Bearer SEU_TOKEN_AQUI'
));
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
//var_dump($ch);
// Executa a requisição
$response = curl_exec($ch);

// Verifica se ocorreu algum erro
if(curl_errno($ch)) {
echo 'Erro: ' . curl_error($ch);
}

// Fecha a sessão cURL
curl_close($ch);

// Imprime o resultado
$resposta = json_decode($response);

echo ltrim($resposta->choices[0]->text);// . "\n";
} else{
exit();
}

Depois a resposta da API é jogada em um textarea no outro arquivo:
<div class="mb-3">
<label for="message-text" class="col-form-label">Resposta:</label>
<textarea class="form-control" id="message-text" name="message-text" style="height: 10em;"><?php if(isset($resposta->choices[0]->text)) { echo ltrim($resposta->choices[0]->text); } ?></textarea>
</div>


10. cURL - json e PHP

CASSIANO DE ARAUJO GUIMARÃES
cassianoag

(usa CentOS)

Enviado em 24/01/2023 - 22:05h


4- A tua aplicação em PHP trabalha com XML ou JSON? Ou com os dois? Com Json.

5- A tua aplicação em PHP trabalha com alguma API em específico? Ela se conecta com alguma API em específico? Conecta com API especifico. O sistema que possuo vai acessar através do webservice passando inserções.

6- Como você está passando o POST para este arquivo do código em questão? Não entendi bem sua pergunta, mas Estou passando através do corpo através da array como informado acima. Passo a key e value só que o sistema que é de terceiro (não foi eu que fiz) não consegue autorizar minha requisição que estou enviando.