많은 사람들이 오늘 충동 고백 정기적으로, 그의 여자 친구에게 문자 메시지를 보낼 SMS 인터페이스를 보내는 기능을 수행하지만, 기본적으로 면죄, 충전합니다. SMS 플랫폼을 통해 네트워크를 구축에서 (http://sms.webchinese.cn/default.shtml) 각각의 샘플 코드의 매우 언어를 찾을 수 있습니다. 나는 최신 버전에 해당하는 직접 받는다는 패키지를로드 항아리 패키지의 기본 버전을 사용하지 않은, 다음, 문제가되고, 4.0 org.apache.httpcomponents 크게, 여러 가지 방법으로 업데이트되어 있어야합니다 특히 후 직접 반환 값은 -41입니다 테스트를 알 수있는 플랫폼 API에 따라 시간이 오래 사용할 수 없습니다 표시됩니다 : 전화 번호, 코드의되어 다음과 같은 부분 비어 있습니다 :
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.config.CookieSpecs;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
public class SendMessageService {
// 接口地址
private Log logger = LogFactory.getLog(this.getClass());
private HttpClient httpClient = null;
private HttpPost httpPost = null;
private long startTime = 0L;
private long endTime = 0L;
private int status = 0;
//测试方法
public static void main(String[] args) {
SendMessageService ac = new SendMessageService("http://utf8.api.smschinese.cn/");
List<NameValuePair> list = new LinkedList<NameValuePair>();
//设置用户名
NameValuePair param1 = new BasicNameValuePair("Uid", "xxx");
//设置秘钥,这个秘钥不是你用户名密码,要去网站上查看
NameValuePair param2 = new BasicNameValuePair("Key", "xxx");
//设置收信人号码
NameValuePair param3 = new BasicNameValuePair("smsMob", "xxx");
//设置短信内容,内容中不宜出现空格等特殊符号
NameValuePair param4 = new BasicNameValuePair("smsText", "xxx");
list.add(param1);
list.add(param2);
list.add(param3);
list.add(param4);
System.out.println(ac.post(list));
System.out.println(ac.getStatus());
}
//构造方法
public SendMessageService(String url) {
if (url != null) {
this.apiURL = url;
}
if (apiURL != null) {
RequestConfig config = RequestConfig.custom().setCookieSpec(CookieSpecs.STANDARD_STRICT).build();
this.httpClient = HttpClients.custom().setDefaultRequestConfig(config).build();
this.httpPost = new HttpPost(apiURL);
}
}
//调用接口API
public String post(List<NameValuePair> list) {
String body = null;
if (this.httpPost != null & list != null ) {
try {
UrlEncodedFormEntity entityParam = new UrlEncodedFormEntity(list, "UTF-8");
httpPost.setEntity(entityParam);
this.startTime = System.currentTimeMillis();
HttpResponse response = httpClient.execute(this.httpPost);
this.endTime = System.currentTimeMillis();
int statusCode = response.getStatusLine().getStatusCode();
logger.info("statusCode:" + statusCode);
logger.info("调用API 花费时间(单位:毫秒):" + (this.endTime - this.startTime));
if (statusCode != HttpStatus.SC_OK) {
logger.error("Method failed:" + response.getStatusLine());
this.status = 1;
}
// Read the response body
body = EntityUtils.toString(response.getEntity());
} catch (IOException e) {
// 网络错误
this.status = 3;
} finally {
logger.info("调用接口状态:" + this.status);
}
}
return body;
}
/**
* 0.成功 1.执行方法失败 2.协议错误 3.网络错误
* @return the status
*/
public int getStatus() {
return this.status;
}
public long getStartTime() {
return this.startTime;
}
public long getEndTime() {
return this.endTime;
}
}
내가 전화 번호의 요청 정보를 인식 할 수 없기 때문에, 그 요청 매개 변수는 다음 확실히 구성 매개 변수에 문제가있는 것입니다. 그래서 당신이 공포의 상속에 따라, 세션 객체 소스를보고 그것을 확인해야한다, 마지막으로 우리는이 도구 클래스 org.apache.http.client.utils.URLEncodedUtils을 발견했다.
public static String format(
final List <? extends NameValuePair> parameters,
final String charset) {
return format(parameters, QP_SEP_A, charset);
}
public static String format(
final List <? extends NameValuePair> parameters,
final char parameterSeparator,
final String charset) {
final StringBuilder result = new StringBuilder();
for (final NameValuePair parameter : parameters) {
final String encodedName = encodeFormFields(parameter.getName(), charset);
final String encodedValue = encodeFormFields(parameter.getValue(), charset);
if (result.length() > 0) {
result.append(parameterSeparator);
}
result.append(encodedName);
if (encodedValue != null) {
result.append(NAME_VALUE_SEPARATOR);
result.append(encodedValue);
}
}
return result.toString();
}
당신은 등 매개 변수 이름과 값을 꺼내어 제 2 포맷 방법, 중간 연결 "&"에서 볼 수 아니다 거의 첫 번째 매개 변수 이전 URL 사이 무엇을? ""그것은? ? 물론 충분히, 직접 문제를 해결 물음표로 URL을 선언 할 때 : HTTP : //utf8.api.smschinese.cn/, 그래서 그 이후의 바느질 처리 후 제대로 매개 변수를 읽기 위해한다.
또한, 하나 개의 공정이 될 수있는 URL를 선언 더하여 해당 파라미터 정보 때 더 단순하고 직접적인 정제 방법이지만,이 코드의 유지 보수 및 확장에 특히 도움이 아니다.