Pergunta

Estou tentando POST no servidor de um fornecedor usando PHP 5.2 com cURL.Estou lendo um documento XML para postar no servidor e depois lendo uma resposta:

$request = trim(file_get_contents('test.xml'));
$curlHandle = curl_init($servletURL);
curl_setopt($curlHandle, CURLOPT_POST, TRUE);
curl_setopt($curlHandle, CURLOPT_POSTFIELDS, array('XML'=>$request));
curl_setopt($curlHandle, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($curlHandle, CURLOPT_HEADER, FALSE);  # Have also tried leaving this out
$response = curl_exec($curlHandle);

Esse código, por si só, funciona bem, mas o outro servidor retorna uma resposta de seu analisador XML informando:

Conteúdo não permitido no prólogo

Procurei esse erro e isso normalmente é causado por espaços em branco antes do XML, mas me certifiquei de que o arquivo XML em si não tivesse espaços em branco e o trim() deveria esclarecer isso de qualquer maneira.Fiz um TCPDump na conexão enquanto executava o código e foi isso que foi enviado:

POST {serverURL} HTTP/1.1
Host: {ip of server}:8080
Accept: */*
Content-Length: 921
Expect: 100-continue
Content-Type: multipart/form-data; boundry:---------------------------01e7cda3896f

---------------------------01e7cda3896f
Content-Disposition: form-data; name="XML"

[SNIP - the XML was displayed]

---------------------------01e7cda3896f--

Antes e depois da linha [SNIP], há espaços em branco visíveis quando reproduzo a sessão no Ethereal.É isso que está causando o problema e, em caso afirmativo, como posso removê-lo ou estou procurando longe demais e isso pode ser um problema com o servidor no qual estou postando?

Foi útil?

Solução 2

Acontece que é um problema de codificação.O aplicativo aparentemente precisa do XML em www-form-urlencoded em vez de form-data, então tive que mudar:

# This sets the encoding to multipart/form-data
curl_setopt($curlHandle, CURLOPT_POSTFIELDS, array('XML'=>$request));

para

# This sets it to application/x-www-form-urlencoded
curl_setopt($curlHandle, CURLOPT_POSTFIELDS, 'XML=' . urlencode($request));

Outras dicas

Não é uma resposta, mas acho toda essa coisa de fopen/fread/fclose muito chata de ler quando se olha o código.

Você pode substituir:

$file = 'test.xml';
$fileHandle = fopen($file, 'r');
$request = fread($fileHandle, filesize($file));
fclose($fileHandle);
$request = trim($request);

Com:

$request = trim(file_get_contents('test.xml'));

Mas de qualquer maneira - para a sua pergunta;se esses são os cabeçalhos que estão sendo enviados, não deverá haver problema com o servidor remoto.Tente alterar o conteúdo do seu arquivo xml e usar var_dump() para verificar a saída exata (incluindo o comprimento da string, para que você possa procurar coisas que faltam)

espero que ajude

Eu fiz um wc -m test.xml e voltou com 743 caracteres no arquivo XML e o var_dump sobre $request volta com 742 caracteres, então algo está sendo removido trim() (Eu assumo).

Eu fiz um:

print "=====" . $request . "=====";

e o início e o fim do XML vão até ===== sem espaço em branco.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top