简体   繁体   English

在Java中从移动设备读取HTTP POST

[英]Read HTTP POST from mobile in java

I have iOS Swift code, which sends a POST request to server. 我有iOS Swift代码,它将POST请求发送到服务器。 If i send this code directly to apple server i get response back with proper data. 如果我直接将此代码发送到Apple服务器,则会得到正确数据的响应。 But when i send this to my server, server could not get the body of the HTTP POST. 但是,当我将其发送到服务器时,服务器无法获取HTTP POST的正文。

I have no idea whether this issue is related to client side or server side. 我不知道此问题是与客户端还是服务器端有关。

Here is the Swift code. 这是Swift代码。

func validateReceipt(completion : (status : Bool) -> ()) {

        let receiptUrl = NSBundle.mainBundle().appStoreReceiptURL!

        if NSFileManager.defaultManager().fileExistsAtPath(receiptUrl.path!)
        {
            if let receipt : NSData = NSData(contentsOfURL: receiptUrl)
            {
                let receiptdata: NSString = receipt.base64EncodedStringWithOptions(NSDataBase64EncodingOptions.EncodingEndLineWithLineFeed)

                let dict = ["receipt-data" : receiptdata]

                let jsonData = try! NSJSONSerialization.dataWithJSONObject(dict, options: NSJSONWritingOptions(rawValue: 0))

                let request = NSMutableURLRequest(URL: NSURL(string: ReceiptURL.MAIN_SERVER.rawValue)!)

                let session = NSURLSession.sharedSession()
                request.HTTPMethod = "POST"
                request.HTTPBody = jsonData

                let task = session.dataTaskWithRequest(request, completionHandler: { data, response, error in

                    if let dataR = data
                    {
                        self.handleData(dataR, completion: { status in

                            completion(status: status)
                        })
                    }
                })

                task.resume()
            }
            else
            {
                completion(status: false)
            }
        }
        else
        {
            completion(status: false)
        }
    }

and here is my Java code in server side, there are two Java classes which take care of this 这是我在服务器端的Java代码,这里有两个Java类

MyRequestWrapper.Java

package webservice;

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

public class MyRequestWrapper extends HttpServletRequestWrapper {
     private final String body;
     public MyRequestWrapper(HttpServletRequest request) throws IOException {
       super(request);
       StringBuilder stringBuilder = new StringBuilder();
       BufferedReader bufferedReader = null;
       try {
         InputStream inputStream = request.getInputStream();
         if (inputStream != null) {
           bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
           char[] charBuffer = new char[100000];
           int bytesRead = -1;
           while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
             stringBuilder.append(charBuffer, 0, bytesRead);
           }
         } else {
           stringBuilder.append("");
         }
       } catch (IOException ex) {
           throw ex;
       } finally {
         if (bufferedReader != null) {
           try {
             bufferedReader.close();
           } catch (IOException ex) {
             throw ex;
           }
         }
       }
       body = stringBuilder.toString();
     }

     @Override
     public ServletInputStream getInputStream() throws IOException {
       final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes());
       ServletInputStream servletInputStream = new ServletInputStream() {
         public int read() throws IOException {
           return byteArrayInputStream.read();
         }
       };
       return servletInputStream;
     }

     @Override
     public BufferedReader getReader() throws IOException {
       return new BufferedReader(new InputStreamReader(this.getInputStream()));
     }

     public String getBody() {
       return this.body;
     }
    }

And here is the another class. 这是另一类。

GetResult.Java

package webservice;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

import org.apache.log4j.Logger;
import org.json.JSONException;
import org.json.JSONObject;

@Path("/service")
public class GetResult {
    static Logger logger = Logger.getLogger(GetResult.class);
    // @Produces("application/json; charset=UTF-8")
    //@Produces("text/plain")
    @POST
    @Produces (MediaType.APPLICATION_JSON)
    public Response inapp(@Context HttpServletRequest request,
            @Context HttpServletResponse response) throws Exception {

        System.out.println("response===" + response);
        System.out.println("Request-Header===" + request.getHeader("receipt-data"));
        System.out.println("Request===" + request.getParameter("receipt-data"));
        // System.out.println("Request==="+request.getReader());
        // reader(request,response);
        // getBody(request);
        doFilter(request,response);
        String result = "";
        result = " " /* jsonObject */;
        return Response.status(200).entity(result).build();

    }

We could get the client IP and client Port from this request but unable to get the body. 我们可以从此请求获取客户端IP和客户端端口,但无法获取正文。 In production also we could not get the body. 在生产中我们也无法得到尸体。 Some Java developers told me that you cant directly get the raw bytes in Java, i don't know about this. 一些Java开发人员告诉我,您无法直接获取Java中的原始字节,我对此一无所知。

Somebody please take a look at this, and tell me what i am doing wrong. 有人请看一下,并告诉我我做错了什么。

You may have to explicitly set the content type of the input post body you send to the server. 您可能必须显式设置要发送到服务器的输入帖子正文的内容类型。 This can be achieved as follows: 这可以通过以下方式实现:

    request.addValue("application/json", forHTTPHeaderField: "Content-Type")

Set the content type after setting the http method and son data to the request object( NSMutableURLRequest object) 将http方法和子数据设置为请求对象(NSMutableURLRequest对象)后,设置内容类型

This may help you! 这可能对您有帮助!

Edited: Actually the header field name is "Content-Type". 编辑:实际上标题字段名称是“ Content-Type”。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM