5

利用した

curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);

size_t write_data(void *ptr, size_t size, size_t count, void *stream)
{
    printf("%*.*s", size * count, size * count, ptr);
}

以下の出力を取得するには、本文コンテンツのみを取得する必要があります

* About to connect() to 10.10.1.112 port 8081 (#0)
*   Trying 10.10.1.112... * connected
* Connected to 10.10.1.112 (10.10.1.112) port 8081 (#0)
> POST /iit_mobile/services/application?wsdl HTTP/1.1
Host: 10.10.1.112:8081
Accept: */*
Content-type:application/soap+xml; charset=utf-8; action="http://wsdlclass.wsdlcreat.sims.test.com/userloginMethod"
Content-Length: 629

< HTTP/1.1 200 OK
< Server: Apache-Coyote/1.1
< Content-Type: application/soap+xml;charset=utf-8
< Transfer-Encoding: chunked
< Date: Tue, 11 Jun 2013 13:22:35 GMT
< 
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   338    0   338    0     0     36      0 --:--:--  0:00:09 --:--:--     0* Connection #0 to host 10.10.1.112 left intact

* Closing connection #0
<?xml version="1.0" encoding="utf-8"?><soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soapenv:Body><userloginMethodResponse xmlns="http://wsdlclass.wsdlcreat.sims.test.com"/></soapenv:Body></soapenv:Envelope>

コード:

curl = curl_easy_init();
if(curl)
{

    out_fd = fopen (filename, "w");
    curl_easy_setopt(curl, CURLOPT_FILE, out_fd);

    headers = curl_slist_append(headers, "Content-type:application/soap+xml; charset=utf-8; action=\"http://wsdlclass.wsdlcreat.sims.test.com/login\"");
    curl_easy_setopt(curl, CURLOPT_URL, tmpbuff);
    curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0);
    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);

    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);

    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);


    curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, buffer_size);
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, buffer);

    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
    curl_easy_setopt(curl, CURLOPT_TIMEOUT, Timeout);
    curl_easy_setopt(curl, CURLOPT_ERRORBUFFER,errmsg);

    printf("The Server%s:Performing Transaction.....\n",__func__);
    res = curl_easy_perform(curl);
    printf("res=after culreasey perform%d\n",res);
    curl_slist_free_all(headers);
    curl_easy_cleanup(curl);

    fclose(out_fd);
}
4

1 に答える 1

3

デフォルトでは、ヘッダーは本文データとともに書き出されるべきではありません。コールバックでヘッダーを受信して​​いる場合はwrite_data、おそらくCURLOPT_HEADERオプションまたはオプションのいずれかを設定したことを意味しCURLOPT_WRITEHEADERます。安全のために両方をリセットしてみてください:

curl_easy_setopt(curl, CURLOPT_HEADER, 0L);
curl_easy_setopt(curl, CURLOPT_WRITEHEADER, 0L);

それでもヘッダーを取得したいが、コールバックでは取得したくない場合はwrite_data、次のようにヘッダー データに別のコールバックを設定できます。

curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, write_header);

write_headerあなたの関数と同じように、コールバック関数はどこにありますかwrite_data

size_t write_header(void *ptr, size_t size, size_t count, void *stream)
{
    printf("HEADER: %*.*s", size * count, size * count, ptr);
    return count*size;
}

これらのコールバック関数から書き込まれたバイト数を返すことが重要であることに注意してください。そうしないと、curl はそれをエラーとして扱います。

それでも問題が解決しない場合は、サーバーがヘッダー データの前に空白行を返し、ヘッダーが実際には本文の一部であるかのように見せかけているということしか考えられません。

既知の有効な URL (例: ) に対してテストすることで、その場合は簡単に確認できますhttp://www.example.com/。そこで正しく動作する場合、障害はクライアント コードではなくサーバー コードにあることがわかります。

ただし、完全なコードを見てみると、出力に表示される余分なものはすべて、CURLOPT_VERBOSEオプション (2 回設定したもの) とCURLOPT_NOPROGRESSオプションからのものです。それらをコメントアウトするだけで、コンテンツの本文だけできれいな応答が得られるはずです。

また、コールバックでストリームパラメータCURLOPT_FILEを使用しない限り、設定しても意味がありません。コールバックを設定すると、デフォルトの出力関数が置き換えられるため、自分で設定しない限り、ストリームには何も書き込まれません。write_dataCURLOPT_WRITEFUNCTIONCURLOPT_FILE

于 2013-06-14T16:31:01.270 に答える