2016-06-02 2 views
1

Я пытаюсь создать приложение с ASP.NET Web API и Angularjs

Я пытаюсь получить данные из API, но я получаю нуль ошибка в результате.

Asp.net код веб-апи

[RoutePrefix("api/user")] 
    public class UserController : ApiController 
    { 
     [Route("login")] 
     [HttpGet] 
     public HttpResponseMessage login(string userId, string password) 
     { 
...code to fetch data 
      return Request.CreateResponse(HttpStatusCode.OK, result); 
     } 

веб конфиг

public static void Register(HttpConfiguration config) 
{ 
    // Web API configuration and services 

    // Web API routes 
    config.MapHttpAttributeRoutes(); 

    config.Routes.MapHttpRoute(
     name: "DefaultApi", 
     routeTemplate: "api/{controller}/{id}", 
     defaults: new { id = RouteParameter.Optional } 
    ); 


    var formatters = GlobalConfiguration.Configuration.Formatters; 

    formatters.Remove(formatters.XmlFormatter); 

    config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/json")); 
} 

Угловая Js Код

 this.get = function (url, headers = {}) { 

     /// creating a defer 
     var def = $q.defer(); 
     $http({ 
      url: url, 
      dataType: 'json', 
      method: 'GET', 
      data: '', 
      headers: headers 

     }).success(function (data) { 
      def.resolve(data); 
     }).error(function (error) { 
      def.reject(error); 
     }); 

     return def.promise; 
    }; 

Результат

Когда я пытаюсь get результат, нажав API URL-адресов я получаю ошибку null

Если я открываю URL-адрес в веб-браузере, то он, возвращая JSON

сети Войти

{ 
    "log": { 
    "version": "1.2", 
    "creator": { 
     "name": "WebInspector", 
     "version": "537.36" 
    }, 
    "pages": [], 
    "entries": [ 
     { 
     "startedDateTime": "2016-06-02T16:27:59.550Z", 
     "time": 25.981999933719635, 
     "request": { 
      "method": "GET", 
      "url": "http://localhost:62158/api/user/login?userId=undefined&password=abc", 
      "httpVersion": "HTTP/1.1", 
      "headers": [ 
      { 
       "name": "Origin", 
       "value": "http://localhost:8000" 
      }, 
      { 
       "name": "Accept-Encoding", 
       "value": "gzip, deflate, sdch" 
      }, 
      { 
       "name": "Host", 
       "value": "localhost:62158" 
      }, 
      { 
       "name": "Accept-Language", 
       "value": "en-US,en;q=0.8,hi;q=0.6,und;q=0.4" 
      }, 
      { 
       "name": "User-Agent", 
       "value": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.63 Safari/537.36" 
      }, 
      { 
       "name": "Accept", 
       "value": "application/json, text/plain, */*" 
      }, 
      { 
       "name": "Referer", 
       "value": "http://localhost:8000/" 
      }, 
      { 
       "name": "Connection", 
       "value": "keep-alive" 
      } 
      ], 
      "queryString": [ 
      { 
       "name": "userId", 
       "value": "undefined" 
      }, 
      { 
       "name": "password", 
       "value": "abc" 
      } 
      ], 
      "cookies": [], 
      "headersSize": 429, 
      "bodySize": 0 
     }, 
     "response": { 
      "status": 200, 
      "statusText": "OK", 
      "httpVersion": "HTTP/1.1", 
      "headers": [ 
      { 
       "name": "Pragma", 
       "value": "no-cache" 
      }, 
      { 
       "name": "Date", 
       "value": "Thu, 02 Jun 2016 16:27:59 GMT" 
      }, 
      { 
       "name": "Server", 
       "value": "Microsoft-IIS/8.0" 
      }, 
      { 
       "name": "X-AspNet-Version", 
       "value": "4.0.30319" 
      }, 
      { 
       "name": "X-Powered-By", 
       "value": "ASP.NET" 
      }, 
      { 
       "name": "Content-Type", 
       "value": "application/json; charset=utf-8" 
      }, 
      { 
       "name": "Cache-Control", 
       "value": "no-cache" 
      }, 
      { 
       "name": "X-SourceFiles", 
       "value": "=?UTF-8?B?QzpcVXNlcnNca2lyXERlc2t0b3BcRSBEcml2ZVxXb3JrIExpdmVcTml0aW4gS0sgU29mdHdhcmVcVmlkZW9MaWJyYXJ5XHByb2plY3RcVmlkZW9MSWJyYXJ5XFZpZGVvTElicmFyeVxhcGlcdXNlclxsb2dpbg==?=" 
      }, 
      { 
       "name": "Content-Length", 
       "value": "46" 
      }, 
      { 
       "name": "Expires", 
       "value": "-1" 
      } 
      ], 
      "cookies": [], 
      "content": { 
      "size": 0, 
      "mimeType": "application/json", 
      "compression": 447, 
      "text": "" 
      }, 
      "redirectURL": "", 
      "headersSize": 447, 
      "bodySize": -447, 
      "_transferSize": 0, 
      "_error": "" 
     }, 
     "cache": {}, 
     "timings": { 
      "blocked": 2.24999990314245, 
      "dns": -1, 
      "connect": -1, 
      "send": 0.19500008784235012, 
      "wait": 22.8659999556839, 
      "receive": 0.6709999870509336, 
      "ssl": -1 
     }, 
     "serverIPAddress": "[::1]", 
     "connection": "15008" 
     } 
    ] 
    } 
} 

Same Hit в браузере дает результат

enter image description here

+0

Используйте Firebug, Chrome Developer Tools или Fiddler, чтобы посмотреть, что происходит по HTTP, это действительно поможет вам разобраться. –

+0

Попробуйте пропустить пустой объект вместо пустой строки. 'data: {}' Btw, '$ http' уже возвращает обещание, нет необходимости делать другое обещание. – Kyle

+0

просто совет, $ http уже возвратить обещание. Вам не нужно обертывать его – rick

ответ

3

Как KKKKKKKK и стога уже указали вам не нужно, чтобы создать еще одно обещание, как $http.get будет уже возвращаться один. Вы должны также использовать then в отличие от succcess/failure

Так что вы хотите должен выглядеть следующим образом:

function getData() { 
    return $http.get('path-to-api/api.json').then( 
    function success(result) { 
     // Do stuff with it 
     return result.data; 
    }, 
    function failure(err) { 
     return err; 
    }); 
} 

ПримечаниеЭтоты помещают вызов в службе и возвращают функцию в объекте от этой службы.

EDIT Поскольку комментарии concates URLS Я добавлю это как редактирование: Так URL вы попав на угловой стороне: http://localhost:62158/api/user/login?userId=undefined&password=abc.json или http://localhost:62158/api/user/login?userId=undefined&password=abc

+0

Я также предлагаю придерживаться точки останова/отладчика внутри функций, возвращенных выше, чтобы узнать, попадает ли она в эту точку и затем осмотрите объекты, чтобы увидеть, действительно ли ваши данные. Если это не так, и ответ в порядке, то вы, вероятно, не возвращаете данные из api – Katana24

+0

** errorr ** '{" data ": null," status ": - 1," config ": { "метод": "GET", "transformRequest": [пустой] "transformResponse": [пустой], "URL": "HTTP: // локальный: 62158/API/пользователь/входа в систему идентификатор пользователя = не определено и пароль = asfd" , "headers": {"Accept": "application/json, text/plain, */*"}}, "statusText": ""} ' ** Ответ ** ' URL запроса: http: // localhost: 62158/api/user/login? userId = undefined & password = asdf Метод запроса: GET Код состояния: 200 OK Удаленный адрес: [:: 1]: 62158' ** то же самое попадание в браузере ** print '{ код: «успешно», сообщение: «Действительный пользователь». } ' –

+0

Я понимаю, что могу реорганизовать код. Я извиняюсь за свои неудачи. Однако вопрос, который я задал здесь, - это то, почему $ http не может получить данные. –

0

@ Katana24 Я не знаю, как поблагодарить вас, но вы заставили меня получить этот ответ ... большое спасибо.

Причина

Asp.net веб-апи не позволяет перекрестный запрос происхождения до и если вы не добавите Access-Control-Allow-Origin в web.config файле. Я сделал это *, поэтому из любого источника API доступны.

<system.webServer> 
    <httpProtocol> 
     <customHeaders> 
      <add name="Access-Control-Allow-Origin" value="*" /> 
     </customHeaders> 
    </httpProtocol> 
</system.webServer> 
+1

Хорошая работа - похоже, если вы можете попасть на сервер, но не видеть никаких данных, тогда что-то должно быть неправильным на стороне сервера. Рад, что вы нашли решение. Я принимаю наличные деньги;) haha ​​ – Katana24

+0

@ Katana24 здесь приходит ваш 10 пунктов :): P лучше, чем наличные –

Смежные вопросы