2017-02-20 17 views
0
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(); 
} 

Я попытался использовать HttpWebRequest, а также httpClient. Я просмотрел около дюжины вопросов, и ни один из них не помог ситуации.C# httpClient не возвращает содержимое

Я могу использовать PHP и Curl и получить результат, который я ищу. Данные, возвращаемые в PHP, представляют собой список ссылок JSON. Это выглядит так.

"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. Он входит в систему с успехом, но я не могу получить данные, которые, по-видимому, должны пройти по телефону.

Я считаю, что есть разница в вызове curl и вызове httpclient, но я не уверен.

всякая помощь приветствуется. я редактировал код на следующее, но строка ответа остается пустым 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(); 
    } 

здесь завиток вызов, который работает

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. 
+0

Вы пытаетесь добавить '' await' в ReadAsStringAsync'? –

+0

Я не вижу никакого кода, который отображает результаты, или помещает их в переменную, к которой у вашего представления будет доступ (например, ViewBag). Вы уверены, что данные фактически не возвращаются, и вы просто не можете их правильно отобразить? –

+0

Никогда не используйте. Повторите попытку в asp.net. Google Стивен Клири и выяснить, почему. – Crowcoder

ответ

0

Использование:

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

Результат будет в responseString.

еще одна проблема:

Вы устанавливаете BaseAddress как CloudApi, так что теперь requestUri при вызове PostAsync должен быть пустым. Как так:

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

Также сделайте себе одолжение и использовать using ключевое слово, представленное C#.

Итак, вот что ваш полный метод должен выглядеть следующим образом:

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(); 
+0

Пробовал это безрезультатно ... responseString все еще пуст. –

+0

Какой код статуса вы получаете в ответ? –

+0

его давая мне статус 200 OK –