2016-07-23 178 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分钟前

非常感谢所有的建议!