在我的一个Android应用程序中,我在调用API时收到错误“java.net.ProtocolException:Connection has established”。 (我提到"Connection already established" exception in HttpsURLConnection寻求解决方案,但没有用)
以下是我调用API的代码。除了一个API之外,代码适用于所有API。该API与其他API的开发方式相同,但仍低于该API的代码抛出错误。
HttpURLConnection con = null;
BufferedReader in = null;
StringBuilder sb = new StringBuilder();
try {
URL uri = null;
uri = new URL(url);
LogUtil.v("~~URL - "+url);
con = (HttpURLConnection) uri.openConnection();
System.setProperty("http.keepAlive", "false");
con.setRequestMethod(requestType); //type: POST, PUT, DELETE, GET
con.setDoOutput(true);
// con.setDoInput(true);
con.setConnectTimeout(TIMEOUT); //20 secs
con.setReadTimeout(TIMEOUT); //20 secs
con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
String authorizationString = "Basic " + Base64.encodeToString((myAuthString).getBytes(), Base64.DEFAULT);
con.setRequestProperty("Authorization", authorizationString);
if( body != null){
LogUtil.v("~~BODY - "+body);
DataOutputStream out = new DataOutputStream(con.getOutputStream());
out.writeBytes(body);
out.flush();
out.close();
}
con.connect();
InputStream inst = con.getInputStream();
in = new BufferedReader(new InputStreamReader(inst));
String temp = null;
while((temp = in.readLine()) != null){
sb.append(temp).append(" ");
}
} catch (IOException e) {
e.printStackTrace();
}catch (Exception e) {
e.printStackTrace();
}finally{
if(in!=null){
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(cb!=null){
if (sb.toString().length() >0) {
LogUtil.v("~~ RESPONSE - "+ sb.toString());
cb.onResponse(sb.toString(), actionCode);
}else{
LogUtil.v("~~ RESPONSE - null");
cb.onResponse(null, actionCode);
}
}
if(con!=null)
con.disconnect();
}
请不要在此建议使用DefaultHttpClient。
我想用上述方法解决问题,因为它正在为所有其他APIS工作。
仅供参考:使用浏览器检查API调用并返回返回数据。在从ANDROID调用时,它只是出现错误。
~~~~~~编辑~~~~~~~~~(服务器端APIS用PHP开发)
让我简化一下我的问题解释:
function API1Call(){
// callAPI(param...)
}
function API2Call(){
// callAPI(param...)
}
callAPI(param..){
// above API call code goes here
}
如果你看到函数callAPI(param ...),它会在需要调用API时执行。
***指现在在我的项目中,我在不同的活动上写了许多api。
仅适用于一个API调用,上面的callAPI(param ...)抛出异常 我在上面提到过。***
~~~~~我的LOGCAT ~~~~~~~
08-31 14:22:45.309: W/System.err(27364): java.net.ProtocolException: Connection already established
08-31 14:22:45.314: W/System.err(27364): at java.net.HttpURLConnection.setRequestMethod(HttpURLConnection.java:666)
08-31 14:22:45.324: W/System.err(27364): at libcore.net.http.HttpsURLConnectionImpl.setRequestMethod(HttpsURLConnectionImpl.java:144)
08-31 14:22:45.329: W/System.err(27364): at
com.indapoint.ewe.api.EWeAPI$1.run(EWeAPI.java:245)
08-31 14:22:45.334: W/System.err(27364): at java.lang.Thread.run(Thread.java:856)
答案 0 :(得分:2)
con.connect()
调用后不要使用getOutputStream()
,因为第二个调用connect()无论如何都要使用{{1}}。