Take the 2-minute tour ×
Stack Apps is a question and answer site for apps, scripts, and development with the Stack Exchange API. It's 100% free, no registration required.

For my app, I allow people to "register" themselves on my site by typing in their Stack Overflow (etc) name. Now it does allow you to use your ID if you know it, but I find that typing in usernames is much more user-friendly.

In the back end, if someone enters a name, I do a query to /users?filter=<name> and look at the results. So if you enter my name, "codeka", or "Jon Skeet" or something else which is unique on the site it comes back with a single response and I just use that directly. If you type in something like "John", there's 1,287 users that come back for /users?filter=John.

The problem is that if your name on the site is exactly "John", then you might find that you're way down the list somewhere. Rather than requiring users to page through the list to find themselves, I'd like to have some way to specify that "filter" returns exact matches only. So if you entered /users?filter=John&exact=true (say) then only users whose names are exactly "John" would come back.

That way, I could still display the list as I do, but then I could make it so that exact matches appear at the top.

Does that seem reasonable?

share|improve this question
    
Your app could refilter what the API returns. –  Dennis Williamson Jun 7 '10 at 4:26
    
@Dennis: the problem is that to get all of the exact matches for "John" I would have to download all 1,287 results from the API before displaying them to the user to choose. That's 43 requests... by adding an exact=true parameter, then I could do it in a single query. –  codeka Jun 7 '10 at 4:28
    
Wouldn't it be better to identify them using their openID that they'd already have on Stack sites anyways? That way you also don't have to write your own authentication system. –  Soviut Jun 7 '10 at 6:51
    
@Soviut: The user's openid isn't public –  balpha Jun 7 '10 at 6:53
    
@Soviut: It's not actually for authentication, the "registration" is just adding users to a list that my app monitors for reputation changes (among other things) - you can "register" any user you like. Basically just an easier method than having to find your user ID. –  codeka Jun 7 '10 at 7:35
    
I was just hoping for this feature as well. I don't need to authenticate the user, I just want them to type a user by their name. Looks like there's a non-ideal way of doing it. It would be nice if the API had this scenario explicitly handled somehow. –  InfinitiesLoop Jun 8 '10 at 15:39
    
@InfinitesLoop: that's my idea as well, just as a way to identify yourself via your name rather than ID. Of course, there's some people with the same name, but in my experience they're a minority and it's easy to show a list of all the people with the same name if that's the case. –  codeka Jun 8 '10 at 23:18
    
min/max on users by name is now case insensitive resulting in a viable 'exact match'. e.g. min=john&max=john see stackapps.com/questions/1060 –  Sky Sanders Jul 9 '10 at 17:14
    
you may now reformat your q into a how-to as there is but one means to this end. you may want to rephrase the q to something like 'how to find all users with exactly matching display name' or some such. a dev-tip tag might not be a bad idea either. –  Sky Sanders Jul 9 '10 at 17:21
    
url broken in the first sentence. –  user8160 Sep 14 '11 at 18:38
    
@hhh: this was from over a year ago... my app is no longer online anyway, it basically did what you can now see here: stackexchange.com/leagues –  codeka Sep 15 '11 at 12:34

2 Answers 2

UPDATE: min/max on users by name is now case insensitive resulting in a viable 'exact match'. e.g. min=john&max=john see http://stackapps.com/questions/1060


the min/max solution that codeka presents seems to work great. While it does not guarantee accurate results, it does drastically reduce network traffic.

I simply check again when I get the results back and filter out non-matches client side, e.g.

Soapi.RouteFactory(site.api_endpoint, apiKey)
    .Users(
    {
        min: username.toLowerCase(),
        max: username.toUpperCase(),
        sort: Soapi.Domain.UserSort.name
    })
    .getPagedResponse(function(data)
    {
        $.each(data.items, function(ignored, user)
        {
            if (user.display_name.toUpperCase() == username.toUpperCase())
            {

                // set the site so we can render links and logo.
                // this can be refactored down to a literal with needed fields only
                user.on_site = site;

http://api.stackoverflow.com/0.9/users?sort=name&min=joey&max=JOEY&order=desc

share|improve this answer

Actually, I think I figured out a way to do this. If you specify the following:

/users?filter=john&sort=name&min=john&max=JOHN

That is, sort by name with "min" and "max" both set to "john" then it returns only those people whose name is exactly John. I wonder whether this efficient for the backend to process? It seems to respond pretty quickly, which is a good sign.

One interesting point is that it seems to be case-sensitive:

/users?filter=john&sort=name&min=john&max=john

Only returns the 24 users whose name is "john" (lower-case "J") but with max=JOHN then I get 224 users whose name is "John" or "john".

With such a large number of exact matches, though, I wonder what the best way to present that is? Just say "there are 224 users with the name 'John', here's the first 30 and if you can't find yourself you'll have to enter your user ID manually"? Maybe this is a corner-case and I'm thinking about it too much :)

share|improve this answer
    
Just thinking about this, min=john&max=JOHN would actually include "gohn" I believe... I'll still have to filter on the client-side. It seems a bit odd that filter is case in-sensitive, but min&max are case-sensitive. –  codeka Jun 7 '10 at 10:15

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .