Javaの-41、キーのキーを呼び出すためにテキストメッセージを送信するSMSのAPIを使用してネットワークを構築する際には、必ず返し、それだけで疑問符です:(

免責事項:この記事はブロガーオリジナル記事です、続くBY-SAのCC 4.0を著作権契約、複製、元のソースのリンクと、この文を添付してください。
このリンク: https://blog.csdn.net/qq_41885819/article/details/100019477

多くは、今日は気まぐれ告白は定期的に、彼のガールフレンドにテキストメッセージを送信するSMSインターフェースを送っていますけど、基本的に許される、充電します。SMSプラットフォームを介してネットワークを構築する(http://sms.webchinese.cn/default.shtml)各サンプルコードの非常に言葉を見つけることができます。私は最新バージョンに対応した直接のmavenパッケージがロードされているJARパッケージのデフォルトのバージョンを使用していなかった、そして、問題となり、4.0 org.apache.httpcomponentsが大きく、多くの方法に更新されている必要があり、特に後戻り値をテストするために長い時間は、プラットフォームAPIによれば、-41であるが知ることができるために直接使用することができない、表示されている:電話番号が空で、次のコードの一部です。

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;
	}
}	

私は電話番号での要求情報を認識できないので、そのリクエストパラメータは、その後、間違いなく設定パラメータに問題があります。だから、あなたは恐怖の継承によると、HttpClientをソースを見て、それをチェックアウトする必要があり、最終的に我々は、このツールのクラス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();
    }

あなたがなどのパラメータの名前と値が取り出されている第二のフォーマット方式、中央の接続「&」から見ることができる、ではありませんほぼ最初のパラメータと前のURLの間に何を、「?」それは?案の定、直接問題に対処疑問符でURLを宣言するときにします。http:?//utf8.api.smschinese.cn/、そのため、その後の綴じ処理後に適切にパラメータを読み込むためです。
また、URL、プラス対応するパラメータ情報を宣言するときに、より簡単、粗方法は直接的であり、一の段階であるが、これは、保守、コードの拡張に特に資するものであることができます。

おすすめ

転載: blog.csdn.net/qq_41885819/article/details/100019477