1

I have built a java routine for accessing a WEB API service, however I am struggling with the VB equivalent for ASP.Net. I get the API response, but I don't know how to convert it to the json elements.

The java version is:

    public boolean canLogin(){
    HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost(hostURL + TOKEN_ACCESS_URL);
    httppost.addHeader("Accept", "application/json");

    // Add the post content
    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(3);
    nameValuePairs.add(new BasicNameValuePair("grant_type", "password"));
    nameValuePairs.add(new BasicNameValuePair("username", accessUserName));
    nameValuePairs.add(new BasicNameValuePair("password", accessPassword));
    try {
        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
    } catch (UnsupportedEncodingException e1) {
        mobileLogDataHandler.ToLog(LogType.Error, "UnsupportedEncodingException closing data stream with error: " + e1.getLocalizedMessage() + ",detail:" + e1.getMessage() + " in canLogin", mResolver, RemoteDataHandler.class);
        return false;
    }

    // post the server
    InputStream inputStream = null;
    String result = null;
    try {
        HttpResponse response = httpclient.execute(httppost);
        if (response.getStatusLine().getStatusCode()!=200){
            mobileLogDataHandler.ToLog(LogType.Error, "Failed to get server token with error: " + response.getStatusLine().toString() + " in canLogin", mResolver, this.getClass());
            return false;
        }
        HttpEntity entity = response.getEntity();
        inputStream = entity.getContent();
        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"), 8);// json is UTF-8 by default
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null)
        {
            sb.append(line + "\n");
        }
        result = sb.toString();
        inputStream.close();

    } catch (ClientProtocolException e) {
        mobileLogDataHandler.ToLog(LogType.Error, "ClientProtocolException trying to get bearer token from server with error: " + e.getLocalizedMessage() + ",detail:" + e.getMessage() + " in canLogin", mResolver, this.getClass());
        return false;
    } catch (IOException e) {
        mobileLogDataHandler.ToLog(LogType.Error, "IOException trying to get bearer token from server with error: " + e.getLocalizedMessage() + ",detail:" + e.getMessage() + " in canLogin", mResolver, this.getClass());
        return false;
    }

    //read the response content
    try{
        JSONObject jObject = new JSONObject(result);
        bearerToken =  jObject.getString("access_token");
        String expiryIntervalInSeconds = jObject.getString("expires_in");
        return canSaveNewBearerToken(bearerToken, expiryIntervalInSeconds);
    } catch (JSONException e){
        mobileLogDataHandler.ToLog(LogType.Error, "JSON error reading data sent from server for bearer token request with error: " + e.getLocalizedMessage() + ",detail:" + e.getMessage() + " in canLogin", mResolver, this.getClass());
        return false;
    }

But in my VB version - this is all I have. How can I read it so that I get the json objects out of it:

Public Function canLogin() As Boolean
    Dim client As HttpClient = New HttpClient
    client.DefaultRequestHeaders.Accept.Add(
            New System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"))

    'Dim content As HttpContent = New StringContent("grant_type=password&username=" & mAccessUserName & "&password=" & mAccessPassword)
    Dim urlEncodedList As New List(Of KeyValuePair(Of String, String))
    urlEncodedList.Add(New KeyValuePair(Of String, String)("grant_type", "password"))
    urlEncodedList.Add(New KeyValuePair(Of String, String)("username", mAccessUserName))
    urlEncodedList.Add(New KeyValuePair(Of String, String)("password", mAccessPassword))
    Dim content As New FormUrlEncodedContent(urlEncodedList)
    'content.Headers.ContentType = New Headers.MediaTypeHeaderValue("application/x-www-form-urlencoded")  'not sure if i need this

    Dim response As HttpResponseMessage = client.PostAsync(New Uri(mHostURL & TOKEN_ACCESS_URL), content).Result

    If response.IsSuccessStatusCode Then
        Return True
    Else
        Return False
    End If


End Function

Any help appreciated.

1 Answer 1

7
Dim response As HttpResponseMessage = client.PostAsync(
                               New Uri("someuri"), content).Result

If response.IsSuccessStatusCode Then
    Dim json As String = response.Content.ReadAsStringAsync().Result
    Dim bearerToken As String = DirectCast(
               JObject.Parse(json).SelectToken("access_token"),
                                    String)
    Return True
Else
    Return False
End If

PS. Make sure you have a reference to JSON.NET. Also, using .Result in ASP.NET is very problematic and can result easily in deadlocks. Better use await.

Sign up to request clarification or add additional context in comments.

1 Comment

Works in year 2024 too, thanks

Your Answer

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

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.