SMS의 API를 사용하여 네트워크를 구축 할 때 항상에만 물음표, 키에 키 자바 -41를 호출하는 문자 메시지를 보내 반환 :(

면책 조항 :이 문서는 블로거 원본입니다, 추적 에 의해-SA의 CC 4.0 저작권 계약, 복제, 원본 소스 링크이 문을 첨부 해주세요.
이 링크 : https://blog.csdn.net/qq_41885819/article/details/100019477

많은 사람들이 오늘 충동 고백 정기적으로, 그의 여자 친구에게 문자 메시지를 보낼 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를 선언 더하여 해당 파라미터 정보 때 더 단순하고 직접적인 정제 방법이지만,이 코드의 유지 보수 및 확장에 특히 도움이 아니다.

추천

출처blog.csdn.net/qq_41885819/article/details/100019477