web-dev-qa-db-ja.com

PHP cURL Content-Typeが設定されていません

接続したい簡単なWebサービスがあります。 Webサービス側で適切に処理されるXMLを投稿するには、適切なリクエストを準備する必要があります。私はそのためにcURLを使用しています:

_try {
    $ch = curl_init();

    if (FALSE === $ch)
        throw new Exception('failed to initialize');

    curl_setopt($ch, CURLOPT_URL,"192.168.1.37");
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
                                            'Content-Type: application/xml',
                                            'Connection: Keep-Alive'
                                            ));
    curl_setopt($ch, CURLOPT_HEADER, 1);
    curl_setopt($ch, CURLOPT_USERPWD, $username . ":" . $password);
    curl_setopt($ch, CURLOPT_PROXY, '');
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_FRESH_CONNECT, TRUE);
    curl_setopt($ch, CURLOPT_HTTPHEADER,array("Expect:  "));
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_POSTFIELDS,$xml);


    $request=  curl_getinfo($ch);
    var_dump($request);


    $content = curl_exec($ch);


    if (FALSE === $content)
        throw new Exception(curl_error($ch), curl_errno($ch));



} catch(Exception $e) {

    trigger_error(sprintf(
        'Curl failed with error #%d: %s',
        $e->getCode(), $e->getMessage()),E_USER_ERROR);

}
_

すべてが大丈夫です。最初にcurl_getinfo($ch);からのリクエスト本文を表示し、次に_$content_変数からの応答を表示しています。

サーバーに送信されるリクエストの制限のみが_Content-Type_ヘッダーです-それは_application/xml_でなければなりません。そうしないとサーバーはエラーで応答します(私の考えではなく、それについて何もできません)

出力リクエストは次のとおりです。

array(21) { ["url"]=> string(68) "192.168.1.37" ["content_type"]=> NULL ["http_code"]=> int(0) ["header_size"]=> int(0) ["request_size"]=> int(0) ["filetime"]=> int(0) ["ssl_verify_result"]=> int(0) ["redirect_count"]=> int(0) ["total_time"]=> float(0) ["namelookup_time"]=> float(0) ["connect_time"]=> float(0) ["pretransfer_time"]=> float(0) ["size_upload"]=> float(0) ["size_download"]=> float(0) ["speed_download"]=> float(0) ["speed_upload"]=> float(0) ["download_content_length"]=> float(-1) ["upload_content_length"]=> float(-1) ["starttransfer_time"]=> float(0) ["redirect_time"]=> float(0) ["certinfo"]=> array(0) { } }

応答は_HTTP 400 Bad Request_です

そこからわかるのは_["content_type"]=> NULL_ですが、この変数をPHPコードで設定しています...

誰が私に欠けていることを教えてもらえますか?

27
Mithrand1r

HTTP_HEADERを2回設定しています:

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
                                            'Content-Type: application/xml',
                                            'Connection: Keep-Alive'
                                            ));

curl_setopt($ch, CURLOPT_HTTPHEADER,array("Expect:  "));

それが問題だと思います。 2回目に設定すると、最初の設定が削除されます。

53
Legionar