java - 用java从手机读取HTTP POST

标签 java ios

我有 iOS Swift 代码,它向服务器发送 POST 请求。如果我将这段代码直接发送到苹果服务器,我会得到正确数据的响应。但是当我将它发送到我的服务器时,服务器无法获取 HTTP POST 的正文。

我不知道这个问题是与客户端有关还是与服务器端有关。

这是 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)
        }
    }

这是我在服务器端的 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;
     }
    }

这是另一个类。

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();

    }

我们可以从此请求中获取客户端 IP 和客户端端口,但无法获取正文。在生产中我们也无法得到 body 。一些 Java 开发人员告诉我,您不能在 Java 中直接获取原始字节,我不知道这一点。

有人请看看这个,告诉我我做错了什么。

最佳答案

您可能必须显式设置发送到服务器的输入帖子正文的内容类型。这可以通过以下方式实现:

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

将http方法和子数据设置到请求对象(NSMutableURLRequest对象)后设置内容类型

这可能对你有帮助!

编辑: 实际上标题字段名称是“Content-Type”。

关于java - 用java从手机读取HTTP POST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33852037/

相关文章:

java - 确定哪个方法抛出异常

ios - 从 appdelegate 中的 viewcontroller 调用方法不会更改屏幕上的文本

ios - Xcode 5 - 启动图像未在 iPhone 应用程序的 iPad 中加载

ios - UIView 不会出现在模拟器中

java - 指定 AccessibilityService 功能

java - 是否可以预览 Java 编译器将生成哪些类文件?

Java DatagramSocket、Dart ClientSocket

java - SharedPreferences getString NULL 参数

php - 视频上传,只上传20秒以下的视频

ios - 动态类型的 Toast 弹出窗口