2011-10-27 28 views
1

私はXMLを投稿し、サーバーからの応答を得ようとしていますが、運がありません。ここでcurlを使用してXMLを正しく送受信する方法

は、サーバー側の条件は以下のとおりです。サーバーへ

  • リクエストはHTTP 1.1を介してXMLとして送信する必要があります。

次の要件は、HTTPリクエストに適用されます。

  • 要求タイプがPOSTである必要があります。
  • Content-Lengthヘッダーが存在し、要求の合計長は16KB未満でなければなりません。
  • ヘッダーが存在し、メディアタイプ値text/xmlが含まれている必要があります。ここで

私のスクリプトです:

$url = "http://somedomain.com"; 
$xml = '<?xml version="1.0" encoding="UTF-8"?> 
<Request PartnerID="asasdsadsa" Type="TrackSearch"> <TrackSearch> <Title>love</Title> <Tags> <MainGenre>Blues</MainGenre> </Tags> <Page Number="1" Size="20"/> </TrackSearch> </Request>'; 
$header = "POST HTTP/1.1 \r\n"; 
$header .= "Content-type: text/xml \r\n"; 
$header .= "Content-length: ".strlen($xml)." \r\n"; 
$header .= "Connection: close \r\n\r\n"; 
$header .= $xml; 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL,$url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_TIMEOUT, 10); 
curl_setopt($ch, CURLOPT_POST, true); 
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $header); 
$data = curl_exec($ch); 
echo $data; 
if(curl_errno($ch)) 
    print curl_error($ch); 
else 
    curl_close($ch); 

これは私を与える:

HTTP Error 400. The request URL is invalid. 
Bad Request - Invalid URL 
+1

somedomain.comのサーバーログにアクセスできますか? 400が実際に何を言おうとしているのかを言うのは難しいです。 – jlb

+0

自分のサーバー上のスクリプトにXMLを投稿し、受け取ったデータが期待どおりであることを確認することができます。 –

答えて

9

は、このヘルプをしていますか?

<?php 
$url = "http://stackoverflow.com"; 
$xml = '<?xml version="1.0" encoding="UTF-8"?><Request PartnerID="asasdsadsa" Type="TrackSearch"> <TrackSearch> <Title>love</Title> <Tags> <MainGenre>Blues</MainGenre> </Tags> <Page Number="1" Size="20"/> </TrackSearch> </Request>'; 

$headers = array(
    "Content-type: text/xml", 
    "Content-length: " . strlen($xml), 
    "Connection: close", 
); 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL,$url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_TIMEOUT, 10); 
curl_setopt($ch, CURLOPT_POST, true); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml); 
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 

$data = curl_exec($ch); 
echo $data; 
if(curl_errno($ch)) 
    print curl_error($ch); 
else 
    curl_close($ch); 
?> 
0

the documentation。 HTTPリクエストを行うとき

CURLOPT_CUSTOMREQUEST

カスタム要求メソッドではなく、 "GET" または "HEAD" を使用します。これは、 "DELETE" や他のより曖昧なHTTPリクエストを行う場合に便利です。有効な値は "GET"、 "POST"、 "CONNECT"などです。つまり、ここにHTTP リクエストライン全体を入力しないでください。たとえば、「GET /index.html HTTP/1.0 \ r \ n \ r \ n」と入力すると正しく表示されません。

CURLOPT_CUSTOMREQUESTのためのパラメータは、単にPOSTでなければなりません、あなたはヘッダーを設定するCURLOPT_HTTPHEADERを使用することができます。

+1

@Jamesが述べるように、より簡潔に 'CURLOPT_POST'を使うことができます。 –

関連する問題