How to get Odata Next Link from the returned JSON object using angular $http service

I have implemented Odata query syntax for my web api. I am successfully able to return only the first 10 results and the link for the further results. However I am unable to extract this link from the JSON object that is returned by the server using my angularjs front end.

Say the server is responding as follows:

{ "odata.metadata":"","value":[ { "id":001,"name":"abc" },{ "id":002,"name":"pqr" },{ "id":003,"name":"xyz" },{ . . . ],"odata.nextLink":"" } 

Now I am displaying the data by using the success method of $http by assigning the returned data to a variable and using ng-repeat. I am assigning it as follows:

.success(function(data)){ $scope.foo = data.value; } 

However when I try to access the next link using:

$scope.link = data.odata.nextLink; 

within the success method it gives me an error. What am I missing over here? How else can I access the link returned? Is there any other method to implement server side paging?

5 Answers

I had the same problem, more or less. I guess it has got to do with JavaScript objects and how their properties are referred to. The reference

data.odata.nextLink 

would mean there is a property "odata" with a sub-property/field "nextLink". This is not the case, "odata.nextLink" is the name of the property. I don't know why OData is like this.

I got the contents of this property by using a string reference i.e.

data['odata.nextLink'] 

Don't know if there is some drawback, but seems to work...

 using Newtonsoft.Json; [JsonProperty("@odata.nextLink")] public string nextPage { get; set; } 

I got it to work using

theReturnedObject['@odata.nextLink'] 

Don't forget that the odata values should have an @ in front of them. I'm not sure how your implementation handles that character but it should be a valid prefix.

The issue I am running into is that some providers use the full path and some only use a relative path from the service endpoint.

The C# method that I devised for use with the Microsoft Graph API is as follows.

private static string GetNextLink ( JObject pjobjResult ) { JProperty jtLastToken = ( JProperty ) pjobjResult.Last; if ( jtLastToken.Name.Equals ( @"@odata.nextLink" ) ) { return jtLastToken.Value.ToString ( ); } // TRUE (There is at least one more page.) block, if ( jtLastToken.Name.Equals ( @"@odata.nextLink" ) ) else { return SpecialStrings.EMPTY_STRING; } // FALSE (The current page is the last one.) block, if ( jtLastToken.Name.Equals ( @"@odata.nextLink" ) ) } // private static string GetNextLink 

In the above method, SpecialStrings.EMPTY_STRING is the name of a true constant that I use in lieu of string.Empty.

A similar method should work for PowerShell, too.

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

You Might Also Like