2014-04-01 5 views
0

WEB API 서비스에 액세스하기위한 Java 루틴을 만들었지 만 ASP.Net에 해당하는 VB로 인해 어려움을 겪고 있습니다. API 응답을 얻을 수 있지만 json 요소로 변환하는 방법을 모르겠습니다.vb.net에서 HttpClient를 사용하여 JSON 응답을 읽는 방법

Java 버전은 다음과 같습니다

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; 
    } 

하지만 내 VB 버전

이 -이 내가 가진 전부입니다. json 객체를 가져올 수 있도록 어떻게 읽을 수 있습니까?

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 

감사합니다.

답변

4
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. JSON.NET에 대한 참조가 있는지 확인하십시오. 또한 ASP.NET에서 .Result을 사용하면 매우 문제가 발생하여 교착 상태가 발생할 수 있습니다. 더 나은 사용 await.

관련 문제