package com.jqmobile.core.http2;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import javax.servlet.http.HttpServletRequest;
import com.jqmobile.core.utils.json.JSONConvertor2;
import com.jqmobile.core.utils.json.JSONObject;
/**
* <p>HTTP 请求工具类</p>
* <p>遵从久其移动《客户端通讯协议》
* <p>Copyright: 版权所有 (c) 2002 - 2015<br>
* Company: 久其</p>
*
* @author modi
* @version 2014年3月17日
*/
public class HttpUtils implements HttpInvoke{
public static final String HTTP_CONNTENT_TYPE = "text/html";
public static final String CHARSET = "UTF-8";
private final String serviceAddress;
private int timeOut = 10000;
public HttpUtils(String url, String uri){
this.serviceAddress = url+uri;
}
public void setTimeOut(int timeOut) {
this.timeOut = timeOut;
}
public int getTimeOut() {
return timeOut;
}
/**
* 获得请求ip
* @param request
* @return String
*/
public static String getRemortIP(HttpServletRequest request) {
if (request.getHeader("x-forwarded-for") == null) {
return request.getRemoteAddr();
}
return request.getHeader("x-forwarded-for");
}
@Override
public HttpSerializableObject invoke(HttpSerializableObject obj)
throws HttpException, Throwable {
//create connection
HttpURLConnection conn = connect(serviceAddress);
conn.setConnectTimeout(timeOut);
conn.setReadTimeout(timeOut);
conn.connect();
//request
PrintWriter out = new PrintWriter(new OutputStreamWriter(
conn.getOutputStream(), CHARSET));
JSONObject ret = JSONConvertor2.serializable(obj);//new JSONObject(obj);
String requestString = ret.toString();
out.print(requestString);
out.flush();
out.close();
//response
StringBuilder sResult = new StringBuilder();
int responseCode = conn.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
InputStream httpInput = null;
BufferedReader httpReader = null;
// 读取数据
httpInput = conn.getInputStream();
httpReader = new BufferedReader(new InputStreamReader(
httpInput, CHARSET));
String line = null;
while ((line = httpReader.readLine()) != null) {
if (sResult.length() > 0) {
sResult.append("\n");
}
sResult.append(line);
}
} else {
throw new HttpException(HttpException.REQUEST_REFUSE, "请求服务器失败:"+responseCode);
}
if(null == sResult || "".equals(sResult.toString().trim())){
return null;
}
JSONObject result = new JSONObject(sResult.toString());
return (HttpSerializableObject)JSONConvertor2.unAutoSerializable(result, HttpSerializableObject.class);
}
/**
* 通过URL建立连接
* @param url
* @return
* @throws IOException
*/
public static HttpURLConnection connect(String url) throws IOException {
URL _url = null;
try {
_url = new URL(url);
} catch (MalformedURLException e) {
e.printStackTrace();
}
HttpURLConnection conn = null;
//
conn = (HttpURLConnection) _url.openConnection();
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setRequestMethod("POST");
conn.setUseCaches(false);
conn.setRequestProperty("Content-type", HTTP_CONNTENT_TYPE);
conn.setRequestProperty("Charset", CHARSET);
//
return conn;
}
}