iOS客户端发送json数据,java(servlet)服务器接受json数据

  • Post author:
  • Post category:java


背景:

我们平时用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

类来转化,方便取出里面的值。这里就不再赘述,读者可自行百度。



版权声明:本文为Feng512275原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。