背景:
我们平时用Get方式发送http请求到服务器,服务器用request.getParameter(“xxx”)方法可以直接拿到值。用POST方式也是,可以直接拿到值,虽然Post方式前面只有服务器地址,参数是在Body部分,java服务器依然可以request.getParameter(“xxx”)的方式获取对应的值。实际开发中,后台给的接口各式各样,现在遇到iOS客户端发送json格式数据,java服务器接受iOS端传来的json格式数据。
iOS端实现思路:
iOS
端既然要传
json
格式的数据,必然会封装成
OC
字典。熟悉
json
格式的人都知道,
json
的大括号就是对应
OC
字典,而
json
的小括号对应
OC
的数组。
第一步,
iOS
端肯定要把所有要传的值全部封装成
OC
字典的格式。
第二步,把封装好的
OC
字典通过
NSJSONSerialization
转化成
NSData
。
第三步,把得到的
NSData
再转成
NSString
类型。
以上三步,说白了就是把要传输的值转成
NSString
类型来传。那么,
java
服务器自然就是字符串的形式来接收即可。
iOS端参考代码:
NSDictionary *jsonDict = @{@"stallInfo":@[
@{@"stallName":stallName,@"shopOneName":shopOneName,@"shopOneDes":shopOneDes,@"shopTwoName":shopTwoName,@"shopTwoDes":shopTwoDes}],
@"longtitude":longtitude,
@"latitude":latitude
};
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:jsonDict options:NSJSONWritingPrettyPrinted error:nil];
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
[PublicAPI requestForPitchParam:jsonString callback:^(id obj) {
}];
+(void)requestForPitchParam:(id)param callback:(ZFCallBack)callback
{
NSString *path = @"http://192.168.1.101:8080/MoveStall/pitch";
NSMutableURLRequest *request = [PublicAPI setupURLRequestAndPath:path param:param requestMethod:@"POST"];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[PublicAPI httpSession:request success:^(id responseOjb) {
callback(responseOjb);
} failure:^(NSError *error) {
callback(error.localizedDescription);
}];
}
+(NSMutableURLRequest *)setupURLRequestAndPath:(NSString *)path param:(id)param requestMethod:(NSString *)requestMethod
{
path = [path stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
NSURL *url = [NSURL URLWithString:path];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
request.HTTPBody = [param dataUsingEncoding:NSUTF8StringEncoding];
request.timeoutInterval = 30;
request.HTTPMethod = requestMethod;
return request;
}
+(void)httpSession:(NSMutableURLRequest *)urlRequest success:(void(^)(id responseOjb))success failure:(void(^)(NSError *))failure
{
NSURLSession *session = [NSURLSession sharedSession];
[[session dataTaskWithRequest:urlRequest completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (error) {
failure(error);
}
else
{
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
success(dict);
}
}] resume];
}
Java服务器实现思路:
上面,已经阐述过了
iOS
端实际是发送字符串,那么
Java
服务器以接受字符串的方式来接收即可。而在这里,
Java
服务器采用
servlet
来编写。
Java服务器参考代码:
/**
* 获取请求的 body
* @param req
* @return
* @throws IOException
*/
public static String getRequestBody(HttpServletRequest req) throws IOException {
BufferedReader reader = req.getReader();
String input = null;
StringBuffer requestBody = new StringBuffer();
while((input = reader.readLine()) != null) {
requestBody.append(input);
}
return requestBody.toString();
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
String jsonString = getRequestBody(request);
System.out.println(jsonString);
JSONObject jsonObj = JSONObject.fromObject(jsonString);
System.out.println(jsonObj);
}
Java
服务器接收到
Json
格式数据后,可以通过
JsonObject
、
JsonArray
类来转化,方便取出里面的值。这里就不再赘述,读者可自行百度。