1
public const string CloudApi = "https://www.idxhome.com/restServices/cloud-idx/login";
public const string password = "cloudidx";
public const string clientId = "65912";
public async Task<ActionResult> Index()
{
    HttpClient client = new HttpClient();
    client.BaseAddress = new Uri(CloudApi);
    client.DefaultRequestHeaders.Accept.Clear();

    var values = new Dictionary<string, string>
    {
       { "clientId", "cloudidx" },
       { "password", "65912" }
    };

    var content = new FormUrlEncodedContent(values);
    HttpResponseMessage response =  await client.PostAsync(CloudApi,content);

    if (response.IsSuccessStatusCode)
    {
        var responseString = response.Content.ReadAsStringAsync().Result;

        response.Content.ToString();
    }

    client.Dispose();

    return View();
}

I have tried using HttpWebRequest as well as httpClient. I have looked through a dozen or so question on here and none of them have helped the situation.

I can use PHP and Curl and get the result I am looking for. The data returned in PHP is a JSON list of links. That looks like this..

 "links":[
     {
        "rel":"search",
        "href":"http://www.idxhome.com/restServices/cloud-idx/client/2/listing-search/MTM4NDMwMDg2MTA3ODoxYjExMWVhNDVlYWVmMjdiOTZhNTE5NjBhMjU3YzYzMzNhZmI0MzkwODk2MmExY2U0NU0ZjFiOGE3YzFhMTU4MjYxNjNlZjNhYjF-hZWFmNDI2ZWE3NmQwMjE4ODdjNmMzNGQxZmIxYTE4MGQ2MjUyM2YZWNhYjAwM2Q5MWFmNzgyYzM3NzcwYzFmNDk5OGM1Y2ExNDZhYjQwMDk2OWI4NmFhYTllZj..."
     },
     {
        "rel":"detail",
        "href":"http://www.idxhome.com/restServices/cloud-idx/client/2/listing-search/MTM4NDMwMDg2MTA3ODoxYjExMWVhNDVlYWVmMjdiOTZhNTE5NjBhMjU3YzYzMzNhZmI0MzkwODk2MmExY2U0NU0ZjFiOGE3YzFhMTU4MjYxNjNlZjNhYjF-hZWFmNDI2ZWE3NmQwMjE4ODdjNmMzNGQxZmIxYTE4MGQ2MjUyM2YZWNhYjAwM2Q5MWFmNzgyYzM3NzcwYzFmNDk5OGM1Y2ExNDZhYjQwMDk2OWI4NmFhYTllZj..."
     },
     {
        "rel":"cities",
        "href":"http://www.idxhome.com/restServices/cloud-idx/client/2/listing-search/MTM4NDMwMDg2MTA3ODoxYjExMWVhNDVlYWVmMjdiOTZhNTE5NjBhMjU3YzYzMzNhZmI0MzkwODk2MmExY2U0NU0ZjFiOGE3YzFhMTU4MjYxNjNlZjNhYjF-hZWFmNDI2ZWE3NmQwMjE4ODdjNmMzNGQxZmIxYTE4MGQ2MjUyM2YZWNhYjAwM2Q5MWFmNzgyYzM3NzcwYzFmNDk5OGM1Y2ExNDZhYjQwMDk2OWI4NmFhYTllZj..."
     },
     {
        "rel":"zips",
        "href":"http://www.idxhome.com/restServices/cloud-idx/client/2/listing-search/MTM4NDMwMDg2MTA3ODoxYjExMWVhNDVlYWVmMjdiOTZhNTE5NjBhMjU3YzYzMzNhZmI0MzkwODk2MmExY2U0NU0ZjFiOGE3YzFhMTU4MjYxNjNlZjNhYjF-hZWFmNDI2ZWE3NmQwMjE4ODdjNmMzNGQxZmIxYTE4MGQ2MjUyM2YZWNhYjAwM2Q5MWFmNzgyYzM3NzcwYzFmNDk5OGM1Y2ExNDZhYjQwMDk2OWI4NmFhYTllZj..."
     }
  ],
"cloudIdxSearchProfile":{
    "bedrooms":2,
    "cityId":"274,284",
    "fullBaths":1,
    "lotAcres":0,
    "maxListPrice":1000000,
    "minListPrice":0,
    "newConstructionYn":false,
    "openHomesOnlyYn":false,
    "propertyType":"SFR,CND",
    "squareFeet":0,
    "zip":"94702,94703"
},
"cloudIdxDetailProfile":{
    "listingNumber":"88873733",
    "boardId":6
},
"message":"Include 'idxCloudSearchProfile' url parameters with requests to the 'search' URL. For 'detail' requests, include 'idxCloudDetailProfile' url parameters."`

API I am trying to utilize. It logs in with success but i cannot get the data that the call to login is suppose to pass along.

I believe there is a difference in the curl call and the httpclient call but i am not sure.

any help is appreciated. I have edited the code to the following but response string is still empty Copy of debug view

        public async Task<ActionResult> Index()
    {
        using (var client = new HttpClient()) { 
        client.BaseAddress = new Uri(CloudApi);
        client.DefaultRequestHeaders.Accept.Clear();
        //client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        var values = new Dictionary<string, string>
        {
           { "clientId", "65912" },
           { "password", "cloudidx" }

        };
        var content = new FormUrlEncodedContent(values);
        HttpResponseMessage response = await client.PostAsync("login", content);
            string responseString = String.Empty;
            if (response.IsSuccessStatusCode)
        {
             responseString = await response.Content.ReadAsStringAsync();

        }
    }
        return View();
    }

here is the curl call that works

function cloudIDXCall($url, $method, $data = array()) {

$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // return response as a string
curl_setopt($curl, CURLOPT_SSLVERSION, 3); // force default SSL version to 3    
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // turn off verification of the remote server's certificate - helps with Windows

$queryString = http_build_query($data); // pack parameters into a URL query string

if ($method == 'get') {
    // GET is the default request method for cURL
    if (strlen($queryString) > 0) $url = $url . '?' . $queryString; // append parameters for GET
} elseif ($method == 'post') {
    curl_setopt($curl, CURLOPT_POST, 1);
    curl_setopt($curl, CURLOPT_POSTFIELDS, $queryString); // set parameters for POST
} else {
    return array('failure' => 'Invalid method');
}

curl_setopt($curl, CURLOPT_URL, $url);
$response = curl_exec($curl);

if ( !$response ) {
    $errMsg = "Error: " . curl_error($curl) . " - Code: " . curl_errno($curl);
    curl_close($curl);
    return array('failure' => $errMsg);
}

$responseArray = json_decode ($response, $assoc = true); // decode JSON into assoc array
curl_close($curl);
return $responseArray;

}

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3; solved the issue... Not sure why it made a difference but it did.
George Schneider
  • 13
  • 1
  • 1
  • 5
  • Did you try to add `await` to `ReadAsStringAsync`? – Yuriy Tseretyan Feb 20 '17 at 23:35
  • I do not see any code that displays the results or puts them in a variable to which your View will have access (e.g. ViewBag). Are you sure the data aren't actually being returned and you're simply failing to display it properly? – John Wu Feb 20 '17 at 23:35
  • Don't ever use .Result in asp.net. Google Stephen Cleary and find out why. – Crowcoder Feb 20 '17 at 23:41
  • @JohnWu In debugging There was no content rendered. the header basically states that no content was returned – George Schneider Feb 21 '17 at 00:07
  • It's because you are passing the endpoint and setting the BaseUri. So you probably aren't hitting the right endpoint and then also the .Result shouldn't be used. Just `await` the response ReadAsStringAsync. – Alex Feb 21 '17 at 00:10
  • @George-- exactly, you have witnessed an empty page. Might be an issue with rendering, not with data retrieval. Can you post the code from your view? Also, maybe set a break point and inspect the variables to see where the data are being lost along the way. – John Wu Feb 21 '17 at 00:11
  • @johnWu it is not being delivered to the view. The responseString is where it should be. when i debug and look through the headers the content say that it is 0. It works in PHP using curl but not in C#. – George Schneider Feb 21 '17 at 00:24
  • Are you passing the parameters in the QueryString of the post or are you using the POST body? – Alex Feb 21 '17 at 15:16

1 Answers1

5

Use:

var responseString = await response.Content.ReadAsStringAsync();

The result will then be in responseString.

Also one more problem:

You set your BaseAddress as the CloudApi, so now the requestUri when you call PostAsync should be blank. Like so:

var response = await client.PostAsync(String.Empty, content);

Also do yourself a favor and use the using keyword provided by C#.

So here's what your full method should look like:

    using(var client = new HttpClient())
    {
        client.BaseAddress = "http://baseApiAddress.com";

        var values = new Dictionary<string, string>
        {
            { "clientId", "cloudidx" },
            { "password", "65912" }
        };

        var content = new FormUrlEncodedContent(values);
        var response = await client.PostAsync("apiMethod", content);
        string responseString = String.Empty;

        if(response.IsSuccessStatusCode)
        {
            responseString = await response.Content.ReadAsStringAsync();
        }
    }

    return View();
Alex
  • 422
  • 4
  • 12
  • Tried this to no avail... the responseString is still empty. – George Schneider Feb 21 '17 at 00:22
  • its giving me status 200 OK – George Schneider Feb 21 '17 at 15:57
  • also its in the query string... I am not sure how to put them in the post body? – George Schneider Feb 21 '17 at 16:00
  • `System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;` this solved my problem! I have no idea why but now i get the same data as I did with my curl call. – George Schneider Feb 21 '17 at 16:51
  • I marked you as the answer because your suggestion to look at the difference between querystring and post body had led me to the header inspection and realization that there were issues in the security protocol – George Schneider Feb 21 '17 at 16:55
  • Well thanks! Wow okay so it was the security protocol! That's weird because I have never had to set that. Maybe if you would of just specified an https endpoint that might of happened but not sure. – Alex Feb 21 '17 at 16:56
  • Yeah it has me thrown for a loop considering it was returning a 200 OK to me that means nothing was wrong with the call and it was returning what it should have been. Just one of those weird issues that sneak up. – George Schneider Feb 21 '17 at 17:27