Dúvida de como usar libcurl.Net

Boa tarde.

Galera é o seguinte.

Preciso consumir um web service e segundo a documentação do mesmo, faz uso do curl.
A documentação vem alguns exemplos de consumo, porém em php.
O sistema que eu uso é todo desenvolvido em Asp.NET com C#.
Procurando na net, encontrei a libcurl.Net que “traduz” os comandos em php para C#.

Segue exemplo em php para consumo segundo a documentação:

$api_server = ‘http://’;
$api_http_user = ‘string_user’;
$api_http_pass = ‘string_pass’;
$chave_acesso = ‘access_key’;
$chave_name = ‘api_key’;
$format = ‘json’;
$params = array(
‘MatriculaID’ => “”,
‘CursoID’ => “”,
‘DisciplinaID’ => “”
);
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, “{$api_server}/format/{$format}”);
curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST);
curl_setopt($curl, CURLOPT_USERPWD, “{$api_http_user}:{$api_http_pass}”);
curl_setopt($curl, CURLOPT_HTTPHEADER, array("{$chave_name}:{$chave_acesso}"));
curl_setopt($curl, CURLOPT_NOBODY, 1);
curl_exec($curl);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($params));
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
$output = curl_exec($curl);
print_r($output); // Resposta do WebService
die;

Eu transcrevi utilizando a libcurl.net e minha classe ficou assim:

public class IesdeApi {
public string Notas() {
string api_server = “http://”;
string api_http_user = “string_user”;
string api_http_pass = “string_pass”;
string chave_acesso = “access_key”;
string chave_name = “access_key”;
string format = “json”;
string[] par = { “MatriculaID”, “CursoID”, “DisciplinaID” };
par[0] = “”;
par[1] = “”;
par[2] = “”;

    Curl.GlobalInit((int)CURLinitFlag.CURL_GLOBAL_ALL);
    Easy easy = new Easy();        
    easy.SetOpt(CURLoption.CURLOPT_URL, "{" + api_server + "}/format/{" + format + "}");
    easy.SetOpt(CURLoption.CURLOPT_USERPWD, "{" + api_http_user + "}:{" + api_http_pass + "}");
    easy.SetOpt(CURLoption.CURLOPT_HTTPHEADER, "{" + chave_name + "}:{" + chave_acesso + "}");
    easy.SetOpt(CURLoption.CURLOPT_NOBODY, 1);               
    easy.SetOpt(CURLoption.CURLOPT_HEADER, 0);
    easy.SetOpt(CURLoption.CURLOPT_POST, 1);
    easy.SetOpt(CURLoption.CURLOPT_POSTFIELDS, par);
    easy.SetOpt(CURLoption.CURLOPT_SSL_VERIFYPEER, 0);
    easy.Perform();
    easy.Cleanup();
    Curl.GlobalCleanup();

    return easy.toString();
}

};

Se alguém puder ajudar onde estou errando e o que está faltando, fico agradecido.
Ou puder indicar algum tutorial ou manual oficial.

Já revirei google e bing e cheguei nisso ai, mas parece que está faltando alguma coisa.
Como saída estou jogando a “resposta” numa label.

Olá Tiago! Estou precisando da mesma coisa e pelo que vejo o código PHP parece ser o webservice da mesma empresa rsrs! Você teve sucesso em algo? Encontrei a Biblioteca LibCurl.net a poucos minutos, então ainda não testei. Mas já tentamos em VB, pensamos em usar Jquery.

PS. Uma pena disponibilizarem apenas o código em PHP.

Tiago! A solução que usamos aqui não foi a mais bonita, mas funciona.

Fizemos o seguinte: Colocamos os códigos da pagina em PHP em um Servidor que já existia.
Como o retorno da pagina em Exemplo vem em Json, chamamos ela na função .Net que vamos usar.

Tentamos de todas as formas fazer funcionar na pagina em VB ou C#, mas devido ao tempo o melhor caminho foi esse.

Boa noite Diego, td bem.

Cara na verdade como eu tenho um pouco de tempo, ainda vou brigar com esse webservice … =D.
Na verdade hoje consegui avançar um pouco mais. Fui barrado pelo servidor com erro 401 - Unauthorized .

Avancei um pouco pois acabei mudando a estratégia e estou acessando utilizando a classe HttpWebRequest e a classe HttpWebResponse, ambos do System.Net, para poder consumir o webservice.
Acredito que deve faltar algum detalhe para quando adiciono os Headers com o usuário e senha, a chave e o token para não ter autorização.

Mas partiu brigar com esse bicho.

Assim que resolver, coloco a solução.

Tiago;

As formas que tentamos aqui sempre paramos neste mesmo erro, no inicio imaginei que fosse o usuário ou a chave, porém no PHP funcionou.

Mas vou acompanhar o seu andamento com a solução. Bom trabalho :wink:

Diego também testei com o php e obtive resposta do webservice.
Mas bom saber que vocês também enroscaram e obtiveram o mesmo erro.
Assim são mais argumentos caso seja necessário cobrar do fornecedor.

De qualquer forma obrigado pelo seu relato.

Bom, cheguei a seguinte situação usando a libcurl.Net .

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http;
using System.Net;
using SeasideResearch.LibCurlNet;

public class IesdeApi {
string api_server = “url”;
string api_http_user = “user”;
string api_http_pass = “pass”;
string chave_name = “API-KEY”;
string chave_acesso = “token”;
string format = “json”;

public string Notas() {
    try {
        string strParam = "MatriculaID=1&CursoID=1&DisciplinaID=1";

        Curl.GlobalInit((int)CURLinitFlag.CURL_GLOBAL_ALL);
        Easy easy = new Easy();

        easy.SetOpt(CURLoption.CURLOPT_URL, "{"+api_server+"}/format/{"+format+"}");
        easy.SetOpt(CURLoption.CURLOPT_USERPWD, "{"+api_http_user+"}:{"+api_http_pass+"}");
        easy.SetOpt(CURLoption.CURLOPT_HTTPHEADER, "{"+chave_name+"}:{"+chave_acesso+"}");
        easy.SetOpt(CURLoption.CURLOPT_NOBODY, 1);
        easy.SetOpt(CURLoption.CURLOPT_HEADER, 0);
        easy.SetOpt(CURLoption.CURLOPT_POST, 1);
        easy.SetOpt(CURLoption.CURLOPT_POSTFIELDS, strParam);
        easy.SetOpt(CURLoption.CURLOPT_SSL_VERIFYPEER, 0);
        string result = easy.Perform().ToString();
        easy.Cleanup();

        Curl.GlobalCleanup();

        return result;
    } catch (Exception e) {
        return e.ToString();
    }
}

};

Na documentação tem a seguinte linha:

curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($params));

Como em asp.Net não tem esse método: http_build_query(); criei uma string formatada já.

Porém estou tendo como retorno o seguinte erro: CURLE_UNSUPPORTED_PROTOCOL .

Numa busca rápida pelo Google, encontrei essa explicação para esse erro:

From libcurl errors manpage:

CURLE_UNSUPPORTED_PROTOCOL (1)
The URL you passed to libcurl used a protocol that this libcurl
does not support. The support might be a compile-time option
that you didn’t use, it can be a misspelled protocol string or
just a protocol libcurl has no code for.

The compile-time option is the important takeaway of this. So, test the library that you’re using with curl_version_info() (manpage here) to see if it contains SSL support or not. The library doc may say it has SSL support, but please confirm. If it doesn’t contain SSL support, then no https.

A luta continua !!!

Boa tarde, eu também estou tentando descobrir uma solução para esse mesmo web service só que em java,
os métodos que não utilizam parametros eu até consegui fazer funcionar com HttpClient e HttpPost, mas os métodos que tem que passar parâmetros com esse CURLOPT_POSTFIELDS não funciona de jeito nenhum, vocês conseguiram achar alguma coisa nova ou somente lendo uma página php mesmo?
Obrigado

@wanderman
Infelizmente a única forma que encontramos mesmo foi utilizando um servidor php que fizesse o host dos exemplos que são fornecidos pelo próprio WebService. Eu no caso, tentei utilizando o C# sem sucesso. A única maneira mesmo foi colocar em um servidor php com o mesmo exemplo, e apenas passar o que eu necessitaria para esse arquivo php. Infelizmente a documentação desse serviço é pobre, além do suporte ao serviço ser inexistente.
Espero que consiga prosseguir com uma solução que não seja paliativa.

Olá Pessoal,

Estou com o mesmo problema, encontraram uma solução?

Obrigada

Bom dia Natalia.

Infelizmente não encontrei uma solução utilizando essa biblioteca. Ela não funcionou.
Testes efetuados com o Curl em php funcionaram excelentemente bem. Criamos um serviço em php que gerava um arquivo xml e este lido pela aplicação em aspx.

Mas infelizmente o projeto não foi aprovado pela empresa e foi abandonado. :confused:

Mas fica ai uma ideia, as vezes pode te ajudar.

Att.

Olá, consegui chamar este webservice utilizando a biblioteca RestSharp, segue abaixo código:

using System;
using System.Net;
using System.Text;
using System.IO;
using System.Web;
using RestSharp;
					
public class Program
{
	public static void Main()
	{
		var client = new RestClient(api_server + "/format/json");
		var request = new RestRequest(Method.POST);
		var chave_acesso = "SUA_CHAVE_ACESSO";
		var api_http_user = "SUA_API_HTTP_USER";
		request.AddHeader("postman-token", "c3afa6be-15aa-6498-5c47-532188bf6c30");
		request.AddHeader("cache-control", "no-cache");
		request.AddHeader("ead-api-key", chave_acesso);
		request.AddHeader("authorization", "Digest username=\""+api_http_user+"\", uri=\"/web_service/getCursos/format/json\", qop=auth, nc=00000001, response=\"087cb23b931dfaa594dc96e83f497038\"");
		try{
			IRestResponse response = client.Execute(request);
			System.Console.Write(response.Content);
		}catch(Exception e){
			System.Console.Write(e.ToString());
		}
	}
}