forked from troyzhxu/okhttps
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMsgConvertor.java
More file actions
108 lines (89 loc) · 2.61 KB
/
MsgConvertor.java
File metadata and controls
108 lines (89 loc) · 2.61 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
package cn.zhxu.okhttps;
import cn.zhxu.data.Array;
import cn.zhxu.data.DataConvertor;
import cn.zhxu.data.DataSet;
import cn.zhxu.data.Mapper;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Type;
import java.net.URLEncoder;
import java.nio.charset.Charset;
import java.util.List;
/**
* 消息转换器接口
*/
public interface MsgConvertor extends DataConvertor {
/**
* 消息的媒体类型
* @return 媒体类型
*/
String mediaType();
/**
* 表单转换器,可用于自动序列化表单参数
*/
class FormConvertor implements MsgConvertor {
private final DataConvertor convertor;
private final boolean urlEncoded;
public FormConvertor(DataConvertor convertor) {
this(convertor, false);
}
/**
* @param convertor DataConvertor
* @param urlEncoded 是否进行 URLEncode 编码
*/
public FormConvertor(DataConvertor convertor, boolean urlEncoded) {
this.convertor = convertor;
this.urlEncoded = urlEncoded;
}
@Override
public String mediaType() {
return "application/x-www-form-urlencoded";
}
@Override
public Mapper toMapper(InputStream in, Charset charset) {
return convertor.toMapper(in, charset);
}
@Override
public Array toArray(InputStream in, Charset charset) {
return convertor.toArray(in, charset);
}
@Override
public byte[] serialize(Object object, Charset charset) {
byte[] result = convertor.serialize(object, charset);
Mapper mapper = convertor.toMapper(new ByteArrayInputStream(result), charset);
StringBuilder sb = new StringBuilder();
mapper.forEach((key, data) -> {
String value = encodeValue(data, charset);
sb.append(key).append('=').append(value).append('&');
});
int endIndex = sb.length() > 1 ? sb.length() - 1 : sb.length();
return sb.substring(0, endIndex).getBytes(charset);
}
private String encodeValue(DataSet.Data data, Charset charset) {
String value = data.toString();
if (urlEncoded) {
try {
return URLEncoder.encode(value, charset.name());
} catch (UnsupportedEncodingException e) {
throw new OkHttpsException("UnsupportedEncoding: " + charset.name(), e);
}
}
return value;
}
@Override
public <T> T toBean(Type type, InputStream in, Charset charset) {
return convertor.toBean(type, in, charset);
}
@Override
public <T> List<T> toList(Class<T> type, InputStream in, Charset charset) {
return convertor.toList(type, in, charset);
}
public DataConvertor getConvertor() {
return convertor;
}
public boolean isUrlEncoded() {
return urlEncoded;
}
}
}