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.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts