2016-07-23 177 views
0

嗨,我有以下捲曲如何從此cURL轉換此HttpURLConnection實現獲取json數據?

curl -X GET --header "api-key: sOmE-API-kEy" "https://api.data.gov.sg/v1/environment/uv-index?date=2016-06-01" 

我從智能國家提供的數據其網站上使用他們的形式返回正確的JSON數據,但我想使用HttpURLConnection的迄今通過代碼來做到這一點的網站得到我遵循我在網上找到的代碼引用,但它不工作,我看不出有什麼問題,我得到了NetworkOnMainThreadException,我通過將它作爲AsyncTask實現來解決,但是當我在android studio中調試它現在返回的FileNotFoundException時。我也嘗試使用下面建議的TrustedManager等,它仍然有相同的錯誤。有一兩件事我注意到的是,當我去的網站,並點擊按鈕,看看它在螢火以下是processessed一...

https://apiconsole-prod.apigee.net/smartdocs/v1/sendrequest?targeturl=https%3A%2F%2Fapi.data.gov.sg%2Fv1%2Fenvironment%2Fuv-index%3Fdate%3D2016-06-01&_=1469245322558 

,但如果我直接從瀏覽器的響應類型有這樣的事情... steps.oauth.v2.FailedToResolveAPIKey%22%7D%7D%7D」, 「responseStatusCode」: 「401」

URL url = new URL("https://api.data.gov.sg/v1/environment/uv-index?date=2016-06-01"); 
    urlConn = (HttpURLConnection)url.openConnection(); 
    urlConn.setRequestMethod("GET"); 
    urlConn.setDoInput(true); 
    urlConn.setDoOutput(true); 
    urlConn.setRequestProperty("Content-Type", "application/json"); 
    urlConn.setRequestProperty("Accept", "application/json"); 
    urlConn.setRequestProperty("api-key", "sOmE-API-kEy"); 

    in = new BufferedReader(new InputStreamReader(urlConn.getInputStream())); 
    String line; 
    StringBuilder buffer = new StringBuilder(); 
    while ((line = in.readLine()) != null) { 
     buffer.append(line).append('\n'); 
    } 
    // Chomp the last newline 
    buffer.deleteCharAt(buffer.length() - 1); 

**注apikey更名爲隱私

所以簡而言之,從螢火蟲的頭部數據如何完成我的HT TP代碼實現

Accept 
*/* 
Accept-Encoding 
gzip, deflate, br 
Accept-Language 
en-US,en;q=0.5 
DNT 
1 
Host  
apiconsole-prod.apigee.net 
Origin 
https://developers.data.gov.sg 
Referer 
https://developers.data.gov.sg/datagovsg-apis/apis/get/environment/uv-index 
User-Agent 
Mozilla/5.0 (Windows NT 10.0; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0 
api-key: sOmE-API-kEy 
+0

我設法使用 http://stackoverflow.com/questions/6343166/how-to-fix-android-os-networkonmainthreadexception 發現的AsyncTask解決方案留下的唯一的問題是我不能讓個NetworkOnMainThreadException解決與我使用網站表單時相同的結果... – debonaire

+0

您是否嘗試禁用證書驗證SSL –

+0

尚未嘗試。感謝您的建議,我會盡快更新你的結果 – debonaire

回答

0

必須禁用證書驗證SSL

TrustManager[] trustAllCerts = new TrustManager[] {new X509TrustManager() { 
      public java.security.cert.X509Certificate[] getAcceptedIssuers() { 
       return null; 
      } 
      public void checkClientTrusted(X509Certificate[] certs, String authType) { 
      } 
      public void checkServerTrusted(X509Certificate[] certs, String authType) { 
      } 
     } 
    }; 

    // Install the all-trusting trust manager 
    SSLContext sc = SSLContext.getInstance("SSL"); 
    sc.init(null, trustAllCerts, new java.security.SecureRandom()); 
    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); 

    // Create all-trusting host name verifier 
    HostnameVerifier allHostsValid = new HostnameVerifier() { 
     public boolean verify(String hostname, SSLSession session) { 
      return true; 
     } 
    }; 

    // Install the all-trusting host verifier 
    HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid); 

    URL url = new URL("https://www.nakov.com:2083/"); 
    URLConnection con = url.openConnection(); 
    Reader reader = new InputStreamReader(con.getInputStream()); 
    while (true) { 
     int ch = reader.read(); 
     if (ch==-1) { 
      break; 
     } 
     System.out.print((char)ch); 
    } 
0

用以下解決...

你或許應該有urlConn.setDoOutput(假);對於GET請求 - Yuri Schimke 3分鐘前

非常感謝所有的建議!