最近、httpリクエストを送信するためのコンポーネントを書いて、要求がOkhttpの全体的な利用を実現するために送信され、もう一度パッケージに基づいて行わOkhttpに基づいて、同じMyBatisのを使うだけでインタフェースを記述する必要があることができ、あなたは直接ビジネス層を呼び出すことができますそれが統合されており、春することができます。APIは、サードパーティや爬虫類を呼び出すために使用することができます。
Mavenの依存性
<dependency>
<groupId>com.github.zw201913</groupId>
<artifactId>simple-http</artifactId>
<version>1.0.0.RELEASE</version>
</dependency>
githubのアドレス:シンプルHTTP
springboot統合
1.のは、どのように直接的かつspringboot統合を見てみましょう:
import com.github.zw201913.simplehttp.annotation.EnableSimpleHttp;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
//开启SimpleHttp
@EnableSimpleHttp
@SpringBootApplication
public class SimpleHttpApplication {
public static void main(String[] args) {
SpringApplication.run(SimpleHttpApplication.class, args);
}
}
SimpleHttpを開いた後、我々はそれを最初にアクセスするためにそれを使用http://www.baidu.comてみてください。
@SimpleHttpService
public interface SimpleHttp {
/**
* 发送get请求访问http://www.baidu.com
* @return
*/
@Get("http://www.baidu.com")
String baidu();
}
次に、我々は、このインタフェースが使用する呼び出すことができます。
@Service
public class TestService {
// 在spring中使用SimpleHttp
@Autowired private SimpleHttp simpleHttp;
public String baidu() {
return simpleHttp.baidu();
}
}
(:インターフェイス名は簡単に自分を取ることができますPS)、それは非常に明確にする必要があり、ここを参照してください、私たちの焦点は、SimpleHttpインタフェースを記述する方法です。
//如果想要url作为参数传入
@Get
String list(@Url String url);
//传入一个参数为id的字段
@Get
String find(@Url String url, @Field("id") Integer id);
//需要设置请求头的
@Get
String find(@Url String url, @Field("id") Integer id, @Header("Content-Type") String contentType);
//多个参数和请求头设置
@Get
String find(@Url String url, @Field Map<String, Object> params, @Header Map<String, String> headers);
カスタムオブジェクトの場合:
//@Data是lombok的注解,可以避免手写get,set方法
// 请求参数实体类
@Data
public class PageParam {
private String search;
private int page;
private int size;
}
// 请求头实体类
@Data
public class RequestHeader {
private String cookie;
private String userAgent;
private String host;
}
@Get
String find(@Url String url, @Field PageParam params, @Header RequestHeader headers);
エンティティクラス名、実際に要求されたフィールド名と異なる場合:
// 请求参数实体类
@Data
public class PageParam {
@Field("name")
private String search;
private int page;
private int size;
}
// 请求头实体类
@Data
public class RequestHeader {
private String cookie;
@Header("User-Agent")
private String userAgent;
private String host;
}
あなたも書くことができます。
@Data
public class PageParamAndRequestHeader {
@Field("name")
private String search;
@Field
private int page;
@Field
private int size;
@Header
private String cookie;
@Header("User-Agent")
private String userAgent;
@Header
private String host;
}
// 至于下面方法的参数修饰到底是使用@Field 还是@Header ,那就看你的心情了
@Get
String find(@Url String url, @Field PageParamAndRequestHeader paramsAndHeaders);
もちろん、ほかに削除し、入れて、郵便だけでなく、要求を取得するには、パッチ......そこのWebSocket
ファイルとパラメータをアップロードします。
// 带一个文件上传的,对应spring mvc里面的
// public User add(@RequestPart("user") User user, @RequestPart("image") MultipartFile[] image)
@Post
String add(@Url String url, @Field("user") Map<String, Object> user, @Field("image") File file);
// 和上面接口一样,只不过把Map改成了自定义的User
@Post
String add(@Url String url, @Field("user") User user, @Field("image") File file);
ファイルが十分でない場合:
// 对应的服务端接口:
// public User add(@RequestPart("user") User user, @RequestPart("image1") MultipartFile[] image1, @RequestPart("image2") MultipartFile[] image2)
@Post
String add(@Url String url, @Field("user") User user, @Field("image1") File[] file, @Field("image2") File[] file);
複数のインターフェースは、ファイルに加えて、複数のパラメータは、ファイルと類似の方法を使用して、同じであるれます。
あなたはファイルをアップロードする必要はありませんし、サーバが@RequestBodyの場合:
// 默认是对应服务端的@RequestBody,且格式化方式是JSON
// 如果发现有File或File[]参数,会自动对应@RequestPart,且携带的其他参数格式化方式是JSON
// 对应服务端接口
// public User add(@RequestBody User user)
@Post
String add(@Url String url, @Field User user);
// 同上
@Post
String add(@Url String url, @Field Map<String,Object> user);
アップロードファイルの進行状況を監視する必要がある場合はどのように行うには?
import com.github.zw201913.simplehttp.core.http.ProgressListener;
// 添加ProgressListener上传进度监听器
@Post
String add(
@Field("user") User user,
@Field("image1") File[] file1,
@Field("image2") File[] file2, ProgressListener progressListener);
限り進捗リスナーオブジェクトパラメータの転送など、あなたには、例えば、現在のスケジュールを取得することができます:
ProgressListener progressListener = (totalLength, currentLength) -> {
int progress = (int) (100 * currentLength / totalLength);
System.out.println(progress + "%");
}
もちろん、唯一のファイルアップロードの進行状況バーがあるでしょう。
また、非同期要求を送信する必要があります。
import okhttp3.Callback;
// 添加异步回调Callback对象,这个时候方法就不需要返回值了
@Post
void add(@Url String url, @Field User user, Callback callback);
例えば:
Callback callback = new Callback() {
@Override
public void onFailure(Call call, IOException e) {}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (response.isSuccessful()) {
String result = response.body().string();
System.out.println(result);
}
}
})
JSON、XMLまたは任意のデータフォーマットであることよりも、必要なデータ・フォーマットを送信するためにあなたを要求する大きな可能性
public interface RequestParamsHandler {
String JSON_UTF8 = "application/json;charset=utf-8";
/**
* 处理请求参数
*
* @param params
* @param files
*/
RequestBody handle(Map<String, Object> params, Map<String, File[]> files);
}
このようなXML形式にパラメータを要求する必要性として、私たちは、カスタムRequestParamsHandlerを実装する必要があります。
public class XMLRequestParamsHandler implements RequestParamsHandler {
@Override
public RequestBody handle(Map<String, Object> params, Map<String, File[]> files) {
//实现将params转换成XML格式,并且返回一个RequestBody对象
return null;
}
}
@Post(handler = XMLRequestParamsHandler.class)
String add(@Url String url, @Field User user)
この場合、我々は、要件が要求されているXMLデータフォーマットを送ることができます。
プロセスをカスタマイズすることができますリクエストパラメータに加えて、我々はまた、カスタマイズすることができ、結果を返すようにしたい
、現在のデフォルトは、結果は無効、文字列、応答することができ返し、3つの結果が自動的に特別な設定なしで処理され返さ。あなたは戻り値の型以外が必要な場合は、するResponseHandlerをカスタマイズする必要があります
public interface ResponseHandler {
/**
* 处理响应对象
*
* @param response
* @param <T>
* @return
*/
<T> T handle(Response response);
}
public class MyResponseHandler implements ResponseHandler {
@Override
public User handle(Response response) {
//处理Response,将返回数据转换成指定对象
return new User();
}
}
@Post
User add(@Url String url, @Field User user, ResponseHandler responseHandler)
あなたがOkHttpClientをカスタマイズしたい場合は、BaseOkHttpClientFactoryを達成することができます:
public abstract class BaseOkHttpClientFactory {
/** final是为了保持单例 */
private final OkHttpClient client;
public BaseOkHttpClientFactory() {
this.client = httpClient();
}
/**
* 留给子类实现
*
* @return
*/
protected abstract OkHttpClient httpClient();
/**
* 获取创建好的OkHttpClient
*
* @return
*/
public OkHttpClient okHttpClient() {
return this.client;
}
}
public class DefaultOkHttpClientFactory extends BaseOkHttpClientFactory {
@Override
protected OkHttpClient httpClient() {
return new OkHttpClient();
}
}
上記は、デフォルトの構成要素です。なぜカスタマイズOkHttpClient、例えば、HTTPSまたはリクエストブローカーのために、達成するためです。
public class HttpProxyOkHttpClientFactory extends BaseOkHttpClientFactory {
@Override
protected OkHttpClient httpClient() {
OkHttpClient client = new OkHttpClient();
// 实现请求代理
return client;
}
}
@Post(clientFactory = HttpProxyOkHttpClientFactory.class)
String add(@Url String url, @Field User user);
最後に、そこのWebSocket:
import okhttp3.WebSocketListener;
// 创建WebSocket,url是ws://echo.websocket.org
@Ws("ws://echo.websocket.org")
WebSocket newWebSocket(WebSocketListener listener);
// 自定义url创建WebSocket
@Ws
WebSocket newWebSocket(@Url String url, WebSocketListener listener);
統合された春
実際には、単純httpおよびSpringフレームワークなどから完全に分離MyBatisのを可能にします。
public class DefaultHttpServiceFactory implements HttpServiceFactory {
/** 缓存代理对象 */
private static final Map<Class<?>, Object> proxyCache = Maps.newConcurrentMap();
/**
* 获取代理对象
*
* @param type
* @param <T>
* @return
*/
@Override
public <T> T getSimpleHttpService(Class<T> type) {
return cacheProxy(type);
}
/**
* 缓存代理对象
*
* @param type
* @param <T>
* @return
*/
private <T> T cacheProxy(Class<T> type) {
T proxy = (T) proxyCache.get(type);
if (Objects.isNull(proxy)) {
proxy = new HttpProxyFactory<>(type).newInstance();
proxyCache.put(type, proxy);
}
return proxy;
}
}
public interface SimpleHttp {
/**
* 发送get请求访问http://www.baidu.com
* @return
*/
@Get("http://www.baidu.com")
String baidu();
}
public class TestSimpleHttp {
private DefaultHttpServiceFactory factory = new DefaultHttpServiceFactory();
public static void main(String[] args) {
SimpleHttp simpleHttp = factory.getSimpleHttpService(SimpleHttp.class)
return simpleHttp.baidu();
}
}
上記の例によると、統合し、春、我々は唯一のか@Bean方法またはXML構成、IOCコンテナの春に注入DefaultHttpServiceFactoryする必要があります。
import com.github.zw201913.simplehttp.core.DefaultHttpServiceFactory;
@Bean
public HttpServiceFactory httpServiceFactory(){
return new DefaultHttpServiceFactory();
}
若しくは
<bean id="httpServiceFactory" class="com.github.zw201913.simplehttp.core.DefaultHttpServiceFactory">
</bean>
使用します。
@Service
public class TestService {
@Autowired
private DefaultHttpServiceFactory factory;
public String baidu() {
SimpleHttp simpleHttp = factory.getSimpleHttpService(SimpleHttp.class)
return simpleHttp.baidu();
}
}
これらは、単純な-HTTPを使用するのは簡単。
ます。https://www.jianshu.com/p/ea28e4d1f5c5で再現